我試圖讓PowerMock與mockito一起工作,並且我正在按照這裏的文檔:http://code.google.com/p/powermock/wiki/MockitoUsage13。PowerMock,mockito,驗證靜態方法
爲了簡化一點,可以說,我有一個靜態方法:
StaticObj.put(String key, String val) { ... }
和類進行測試做這樣的事:
public class ClassToTest {
public void doSomething(Params p) {
if (StringUtils.isNotBlank(p.getK()) StaticObj.put("k1", p.getK());
if (StringUtils.isNotBlank(p.getX()) StaticObj.put("x1", p.getX());
}
}
在我的單元測試我會就像驗證StaticObj.put是否爲K和X,如果它們不是空白或空值,我會這樣做:
public void testNormalCase() {
// assume that mocking setup for statics already happened in some @Before function..
Params params = new Params("k", "x");
ClassToTest classToTest = new ClassToTest();
classToTest.doSomething(params);
// now I want to verify:
PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");
PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");
}
這個工作,這是我所期望的。不起作用的是,如果我評論K的驗證,那麼對X的驗證失敗!該錯誤消息指示(「x1」,「x」)預期得到(「k1」,「k」)。爲什麼是這樣?我沒有正確編碼?
此外,它使我相信,以下類型測試,其通過的,可能傳遞了完全錯誤的原因:
public void testOtherCase() {
// assume that mocking setup for statics already happened in some @Before function..
Params params = new Params("k", null);
ClassToTest classToTest = new ClassToTest();
classToTest.doSomething();
// now I want to verify:
PowerMockito.verifyStatic(never());
StaticObj.put(eq("x1"), anyString());
}
例如我不知道powermock是否看到「k1」,決定「x1」從未被調用過,並通過。 (?)
一般來說,我有一個被稱爲N次(其中N根據輸入參數而變化)的靜態方法。我想驗證它是否在正確的情況下被調用(這可以通過輸入參數來確定)。除非我誤解,否則powermock似乎不能很好地處理這個問題。
感謝您的任何想法!
我已經在一個我認爲可能有關的問題上開了一個問題。 http://code.google.com/p/powermock/issues/detail?id=342 – 2011-08-18 15:58:57