[英]Good practice unit testing method that instantiate an object based on a condition at runtime
[英]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.