2012-11-02 12 views
7

Tôi đang cố gắng kiểm tra một lớp học với một số lớp học riêng tư (vâng, tôi biết điều này thường được coi là thực hành kém để kiểm tra, nhưng câu hỏi này không liên quan đến nguyên tắc thiết kế). Lớp học của tôi sẽ giống như thế này:PowerMock có thể khởi tạo lớp bên trong cho các trường hợp thử nghiệm không?

public class EnclosingClass { 
    . 
    . 
    . 
    private class InnerClass implements InnerClassType { 
    public InnerClass(){ /* do stuff */} 
    public int InnerClassMethod(); 
    } 
} 
  • InnerClassType là một giao diện công cộng

Tôi đã thử instantiating lớp học với powermock bằng cách thực hiện:

Class clazz = Whitebox.getInnerClassType(EnclosingClass.class, "InnerClass"); 
Constructor constructor = Whitebox.getConstructor(clazz, null); 
InnerClassType innerClass = (InnerClassType) constructor.newInstance(null); 

và thêm:

Class clazz = Whitebox.getInnerClassType(EnclosingClass.class, "InnerClass"); 
InnerClassType innerClass = (InnerClassType) Whitebox.invokeConstructor(clazz); 

Tuy nhiên, trên cả hai lần thử, tôi nhận được một số ConstructorNotFoundException

Có thể khởi tạo các lớp bên trong này không? Nếu vậy, tôi đang đi sai ở đâu?

Trả lời

6

Bạn sẽ có thể di chuyển qua ConstructorNotFoundExeception của bạn thông qua các mods sau đây để nỗ lực đầu tiên của bạn:

Class clazz = Whitebox.getInnerClassType(EnclosingClass.class, "InnerClass"); 
Constructor constructor = Whitebox.getConstructor(clazz, EnclosingClass.class); 
InnerClassType innerClass = (InnerClassType) constructor.newInstance(new EnclosingClass()); 

Kể từ lớp bên trong của bạn không phải là tĩnh, nó ngầm hy vọng một "này" tài liệu tham khảo từ các lớp bên ngoài. Sử dụng phương pháp này, có vẻ như bạn phải làm rõ với nó.

+0

Hoạt động hoàn hảo - chắc chắn rằng làm sạch đơn vị của tôi sẽ kiểm tra một loạt! – JoshC13

+0

Cho rằng InnerClass là riêng tư, làm thế nào bạn có thể nhận được InnerClassType ?? –