12

我正在尝试使用许多私人课程来测试一个课程(是的,我知道这通常被认为是可测试性的不良做法,但这个问题与设计原则无关)。我的课看起来像这样:

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

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

4

2 回答 2

11

您应该能够通过以下模块超越您的 ConstructorNotFoundException 到您的第一次努力:

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

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

于 2012-11-06T00:11:54.047 回答
-1

你可以像这样模拟它:

InnerClassType innerClass = (InnerClassType) Mockito.mock(
    Class.forName(EnclosingClass.class.getName() + "$InnerClass")
);
于 2018-04-25T13:24:47.933 回答