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

次のmodを使用して、ConstructorNotFoundExeceptionを通過して最初の作業に進むことができるはずです。

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 に答える