2011-03-12 120 views
11

我試圖讓PowerMock與mockito一起工作,並且我正在按照這裏的文檔:http://code.google.com/p/powermock/wiki/MockitoUsage13PowerMock,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似乎不能很好地處理這個問題。

感謝您的任何想法!

+2

我已經在一個我認爲可能有關的問題上開了一個問題。 http://code.google.com/p/powermock/issues/detail?id=342 – 2011-08-18 15:58:57

回答

6

我仔細閱讀了這個問題和問題,但不確定是否我清楚地理解了這些問題 - 從我的理解中,PowerMock在通過k和x但僅驗證k時引發異常是正確的。

因爲你嘲諷靜態方法StaticObj.put,當你通過參數k x和與

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("k1", "k1"); 

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("x1", "x"); 

驗證,這應該工作。當你驗證參數k和x時,驗證k被註釋掉。

// PowerMockito.verifyStatic(times(1)); 
// StaticObj.put("k1", "k1"); 

PowerMockito.verifyStatic(times(1)); 
StaticObj.put("x1", "x"); 

Powermock顯然會首先接受put(「k1」...)的調用,所以驗證x會產生錯誤。您的驗證過程是按順序排列的。