2

私はテストしようとしてclass Aclass Bます。

public class A {

   @Autowired
   private B b;

   public int foo(int x, int y) {
       int z = b.bar(x, y, false);
       //do something with z
       return z;
   }
}

私はjunitをと一緒に使用してpowermock、でメソッドをmockitoテストしようとしています。fooclass A

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class TestA {

     @Test
     private void testFoo() {
        B b = PowerMockito.mock(B.class);
        when(b.bar(2,3,false)).thenReturn(5);
        A a = PowerMockito.spy(new A());
        Whitebox.setInternalState(a, "b", b);

        int z = a.foo(2,3);
        Assert.assertEquals(10,z);
     }

}

テストを実行しようとすると、NullPointerException内からを取得しますclass Bbarデバッガーを使用した後、のメソッドをスタブした直後にB classbarメソッドが呼び出されることがわかりました。この場合のnullポインタ例外は、Bクラスが適切に初期化されていないため、正常です。

なぜこれが起こっているのか、そして私はそれについて何ができるのか誰かが説明できますか?

4

1 に答える 1

1

私はPowerMockitoユーザーではありませんが、使用する必要はありません@PrepareForTest(B.class)か?アノテーションは、テスト対象のクラスではなく、モックしているクラスの最終的なクラスまたは静的なクラス用であると思います。

また、なぜspy()Aで使用しているのですか?おそらくあなたのサンプルコードはそれを公開していませんが、私はその使用法を見ていません。さらに、本当にAが必要ですかPowerMockito.spy()、それとも単にMockitoのspy()を使用するだけで十分ですか(つまり、 AとBの両方がファイナルであるか、アクセス/モック/検証する必要のある統計がありますか)?

MockitoだけでなくPowerMockitoを使用している理由を聞いてもいいですか?プライベートBをAの中に設定するだけの場合はWhitebox、Mockitoだけでそれを行うことができます。テストメソッドの外でAとBを次のように宣言するだけです。

@InjectMocks A a = new A();
@Mock B b;

そして、すべての@Mockモック(つまりb)をAに挿入します。

PowerMockは、静的メソッドまたは最終クラス/メソッドをモックする場合に主に役立ちます。

于 2012-07-19T19:03:19.230 に答える