我使用PowerMock嘲笑在JUnit測試靜態方法,典型的做法如下:以編程方式替換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
和@PrepareForTest
註釋添加到MockLibraryOne
類,但我會對不僅僅是MockLibraryOne
在其他單元測試更依賴,所以繼承不是一個通用的解決方案。
是否有某種編程方式爲PowerMock下的測試準備類,而不是使用@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);
}
}
我想這將是很好,如果PowerMockRunner
處理@PrepareForTest
註釋的方式有點不同:對於每個指定的類,它不應該只添加類(和它的層次)到類列表爲嘲諷準備,但然後檢查類,看它是否有任何@PrepareForTest
註釋以及:
@RunWith(PowerMockRunner.class)
@PrepareForTest({MockLibraryOne.class})
public class SomeUnitTest {
...
}
@PrepareForTest({Foo.class,Bar.class})
public class MockLibraryOne {
...
}
}
所以在這個@PrepareForTest
annotatio n在SomeUnitTest
將會發現MockLibraryOne
,並且@PrepareForTest
註釋將在Foo.class
和Bar.class
中拖拽。
所以也許寫我自己的測試跑步者替換PowerMockRunner
可能是一個解決方案。
或者有更簡單的解決方案,例如使用PowerMockAgent
類?
編輯:模擬策略可能是一個解決辦法:https://code.google.com/p/powermock/wiki/MockPolicies
編輯:模擬策略可與PowerMockRunner
但不(似乎)與PowerMockRule
(我有時由於類加載器問題需要)。
我正面臨同樣的問題。你有沒有找到解決辦法? – Madhujith
你知道你可以使用每個方法的@PrepareForTest註解來代替每個類嗎? – spekdrum