簡體   English   中英

測試模擬 object 的良好實踐

[英]good practice for testing mocked object

廣泛匹配模擬對象但精確驗證它們是一種很好的做法。 例如:

使用這個:

when(myMock.has(any())).thenReturn(myValue);

而不是:

when(myMock.has(eq("blah")).thenReturn(myValue);

隨着:

var result = myMethod();
assertThat(result, is(myValue));

因為它確保無論has方法輸入如何,它總是返回myValue

這條規則有一個很好的解釋,但我找不到。 大意是: match widely and verify precisely

如果您能告訴我有關規則的名稱或對其的一些參考,那就太好了?

解釋很簡單:它會讓你的生活更輕松。

想象一下調用者不會用“blah”調用你的方法的情況。 在這種情況下,您依賴 mocking 框架將返回什么,很可能是 null,為零或假。 然后,您的測試將運行到不同的方向,甚至會因 NullpointerException 而失敗。 對於其他開發人員來說,很難理解這里出了什么問題。

如果您廣泛匹配,您的測試將按預期繼續,但您應該在之后進行驗證,以使測試失敗並有一個明確的原因。 開發人員傾向於省略驗證步驟,這經常導致測試無用。 通常沒有理由匹配精確的參數值,除非您希望模擬對兩個值采取不同的行動。

大多數框架都提供了方法調用驗證的方法,例如Mockito:

@Mock
private Repository repository;

@Test
private void testReadData() {
    Mockito.when(repository.findById(any())).thenReturn(yourEntity);
    
    // run your test
    
    Mockito.verify(repository).findById("foo");
}

暫無
暫無

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

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