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

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

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

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

由于你的内部类不是静态的,它隐含地期望来自外部类的“this”引用。 使用此方法,看起来你必须明确它。

你可以像这样嘲笑它

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