簡體   English   中英

PowerMock,mockito,驗證靜態方法

[英]PowerMock, mockito, verify static method

我試圖讓 PowerMock 與 mockito 一起工作,我正在關注這里的文檔: http : //code.google.com/p/powermock/wiki/MockitoUsage13

為了簡化一點,假設我有一個靜態方法:

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());
    }
}

在我的單元測試中,我想驗證當 K 和 X 不為空或不為空時是否為 K 和 X 調用了 StaticObj.put,因此我執行以下操作:

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 不能很好地處理這個問題。

感謝您的任何想法!

我仔細閱讀了這個問題和問題,但不確定我是否清楚地理解它們 - 根據我的理解,當您傳遞 k 和 x 但僅驗證 k 時,powermock 引發異常是正確的。

因為你在模擬靜態方法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 的驗證將引發錯誤。 您的驗證過程是有序的。

我不知道是哪個版本,但PowerMockito.verifyStatic(VerificationMode)已被棄用。 只是想向在上一篇文章發布后幾年發現這一點的其他人指出這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM