私は PowerMock を使用して、junit テストで静的メソッドをモックしています。通常は次のように実行されます。
@RunWith(PowerMockRunner.class)
@PrepareForTest({Foo.class,Bar.class})
public class SomeUnitTest {
@Before
public void setUpTest() {
setUpFoo();
setUpBar();
}
private void setUpFoo() {
mockStatic(Foo.class);
when(Foo.someStaticMethod()).thenReturn(1);
}
private void setUpBar() {
mockStatic(Bar.class);
when(Bar.someStaticMethod()).thenReturn(2);
}
@Test
public void someTestCase() {
...
}
}
これは問題なく動作しますが、@PrepareForTest
注釈を指定すると、テスト API を柔軟にすることが妨げられていることがわかりました。
私がやりたいことは、次のようなものです。
public class MockLibraryOne {
public static void setUpLibraryOne() {
setUpFoo();
setUpBar();
}
private static void setUpFoo() {
mockStatic(Foo.class);
when(Foo.someStaticMethod()).thenReturn(1);
}
private static void setUpBar() {
mockStatic(Bar.class);
when(Bar.someStaticMethod()).thenReturn(2);
}
}
@RunWith(PowerMockRunner.class)
public class SomeUnitTest {
@Before
public void setUpTest() {
MockLibraryOne.setUpLibraryOne();
}
@Test
public void someTestCase() {
...
}
}
ここで、単体テストは に依存していますが、依存するLibraryOne
クラスがわからないため、注釈LibraryOne
に追加するクラスがわかりません。@PrepareForTest
クラスにアノテーションをSomeUnitTest
拡張MockLibraryOne
して追加することはできますが、他の単体テスト以外にも依存するため、継承は一般的な解決策ではありません。@PrepareForTest
MockLibraryOne
MockLibraryOne
@PrepareForTest
注釈を使用する代わりに、PowerMock でテストするクラスをプログラムで準備する方法はありますか? たとえば、次のようなものです。
public class MockLibraryOne {
public static void setUpLibraryOne() {
setUpFoo();
setUpBar();
}
private static void setUpFoo() {
prepareForTest(Foo.class);
mockStatic(Foo.class);
when(Foo.someStaticMethod()).thenReturn(1);
}
private static void setUpBar() {
prepareForTest(Bar.class);
mockStatic(Bar.class);
when(Bar.someStaticMethod()).thenReturn(2);
}
}
PowerMockRunner
注釈を少し異なる方法で処理するといいと思い@PrepareForTest
ます。指定されたクラスごとに、そのクラス (およびその階層) をクラスのリストに追加してモックの準備をするだけでなく、そのクラスを調べて、@PrepareForTest
同様に注釈があります:
@RunWith(PowerMockRunner.class)
@PrepareForTest({MockLibraryOne.class})
public class SomeUnitTest {
...
}
@PrepareForTest({Foo.class,Bar.class})
public class MockLibraryOne {
...
}
}
したがって、この@PrepareForTest
注釈でSomeUnitTest
は が見つかりMockLibraryOne
、そこにある注釈はおよびも@PrepareForTest
ドラッグされます。Foo.class
Bar.class
したがって、おそらく、置換する独自のテスト ランナーを作成するPowerMockRunner
ことが解決策になる可能性があります。
PowerMockAgent
または、たとえばクラスを使用して、より簡単な解決策があるのでしょうか?
編集: モック ポリシーは 1 つの解決策かもしれません: https://code.google.com/p/powermock/wiki/MockPolicies
編集:モックポリシーは動作しますが、動作しPowerMockRunner
ません(PowerMockRule
クラスローダーの問題のために必要になることがあります)。