PowerMock可以为测试用例实例化内部类吗?

时间:2012-11-02 19:39:38

标签: java powermock

我正在尝试测试一个包含许多私有类的类(是的,我知道这通常被认为是可测试性的不良实践,但这个问题与设计原则无关)。我的课看起来像这样:

public class EnclosingClass {
  .
  .
  .
  private class InnerClass implements InnerClassType {
     public InnerClass(){ /* do stuff */}
     public int InnerClassMethod();
  }
}
  • InnerClassType是一个公共接口

我已经尝试通过执行以下操作来实例化powermock:

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

还有:

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

然而,在两次尝试中我得到ConstructorNotFoundException

是否可以实例化这些内部类?如果是的话,我哪里错了?

2 个答案:

答案 0 :(得分:7)

您应该能够通过以下mod修改您的ConstructorNotFoundExeception以进行第一次尝试:

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

由于你的内部类不是静态的,它隐含地期望一个"这个"来自外层的参考。使用这种方法,看起来你必须明确它。

答案 1 :(得分:-1)

你可以像这样嘲笑:

InnerClassType innerClass = (InnerClassType) Mockito.mock(
    Class.forName(EnclosingClass.class.getName() + "$InnerClass")
);