簡體   English   中英

Mockito 使用所有匹配器驗證仍然失敗

[英]Mockito verify still fails on using all Matchers

我最近正在寫一個 JUnit 測試,我承認 Mockito 要么需要所有原始值,要么使用所有匹配器,但我發現以下情況對於所有匹配器仍然失敗,錯誤消息是:

參數匹配器的使用無效,預計 0 個匹配器:記錄 1 個:

我進行了一些測試,它看起來與使用存根方法作為 eq() 匹配器的值有關。 請參見下面的示例:

我有一個 Class 一個很簡單

public class A {

    public void testMockitoMatcher(double a, String b){

    }
}

這是我的測試用例

import org.junit.Test;

import static org.mockito.Mockito.*;

public class SomeUnitTest {
    private A mockA = mock(A.class);

    @Test
    public void allMatchersDoesntWork() {
        Object mockObject = mock(Object.class);
        String someString = "Just some mocked String value to return";
        when(mockObject.toString()).thenReturn(someString);

        mockA.testMockitoMatcher(1312d, mockObject.toString());

        verify(mockA, times(1)).testMockitoMatcher(anyDouble(), eq(someString));    //<- This works
        verify(mockA, times(1)).testMockitoMatcher(anyDouble(), eq(mockObject.toString()));    //<- This doesn't by using stub method toString() to return the String value as param to eq()
    }
}

我還通過在第二個驗證語句中使用調試來驗證 mockObject.toString() 仍然可以為我返回存根值。 兩個驗證都使用所有匹配器,為什么 mockito 在第二次驗證時仍然只給我記錄了 1 個匹配器而不是 2 個匹配器?

謝謝!

Mockito 希望您的測試分三個階段進行。

  • 您為測試設置了東西,包括對任何需要存根的方法進行存根(“安排”階段)。
  • 您運行您嘗試測試的實際方法(“行動”階段)。
  • 您對測試的 output 做出斷言,可能包括驗證在您的模擬中調用了哪些方法(“斷言”階段)。

您需要按此順序執行這三件事,因為 Mockito 會跟蹤您是在進行存根、驗證還是其他操作。 它還有自己的內部堆棧,用於存儲匹配器,用於存根或驗證。

在您的示例中的第二個verify調用中,對anyDouble()的調用將Matcher放入堆棧。 但這會為調用mockObject.toString()創建一個無效的 state 。

不要這樣做。 一旦准備好運行斷言和驗證,就不應再調用存根方法。 將每個測試的“安排”、“行動”和“斷言”階段彼此完全分開。

暫無
暫無

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

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