私は次のように一般的に行われ、JUnitテストの静的メソッドを模擬するためにPowerMockを使用しています:PowerMockの@PrepareForTestをプログラムで置き換える?
@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
を拡張し、MockLibraryOne
クラスに@PrepareForTest
注釈を追加する作ることができますが、私はちょうどMockLibraryOne
他のユニットテストよりも上の依存関係を持つことになりますので、継承は、一般的なソリューションではありません。
@PrepareForTest
注釈を使用する代わりに、プログラムでPowerMockでのテスト用のクラスを準備する方法はありますか?たとえば、次のようなもの:に指定された各クラスに対して、それだけでそのクラス(およびその階層)を追加しないでください:PowerMockRunner
は少し違っ@PrepareForTest
注釈を処理した場合、私はそれがいいだろうと思い
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);
}
}
モックの準備をするクラスのリストが、それは同様に任意の@PrepareForTest
注釈を持っているかどうかを確認するために、そのクラスを調べます。この中のSO
@RunWith(PowerMockRunner.class)
@PrepareForTest({MockLibraryOne.class})
public class SomeUnitTest {
...
}
@PrepareForTest({Foo.class,Bar.class})
public class MockLibraryOne {
...
}
}
@PrepareForTest
annotatioをSomeUnitTest
上のnはMockLibraryOne
となり、とBar.class
には@PrepareForTest
注釈が含まれています。
おそらくPowerMockRunner
の代わりに私自身のテストランナーを書くことが解決策になるかもしれません。
たとえば、クラスを使用すると、単純な解決策がありますか?
編集:モックポリシーは1つの解決策になることがあります。https://code.google.com/p/powermock/wiki/MockPolicies
編集:モックポリシー(私は時々、クラスローダの問題のために必要)PowerMockRule
で(それはそう)PowerMockRunner
で動作しますが、ありません。
私は同じ問題に直面しています。解決策は見つかりましたか? – Madhujith
クラスごとではなくメソッドごとに@PrepareForTest注釈を使用できることをご存知ですか? – spekdrum