簡體   English   中英

使用 Mockito.when() 模擬和驗證 vs mockito.verify

[英]Using Mockito.when() to mock and verify vs mockito.verify

想象一下你有方法someMethod ,你將如何通過 go 來測試它?

Mockito.when(someClass.someMethod(someParam)).thenReturn(someValue);
var bar = foo() // SUT: ends upp calling someMethod somewhere in the stack
assertThat(bar).isEqualTo(someValue);

對比

Mockito.when(someClass.someMethod(someParam)).thenReturn(someValue);
var bar = foo() // SUT: ends upp calling someMethod somewhere in the stack
verify(someClass, times(1)).someMethod(someParam)
assertThat(bar).isEqualTo(someValue);

的確, Mockito.when是“某種程度上”驗證正在使用正確的 arguments 調用 someClass.someMethod。我個人喜歡擁有明確斷言/驗證的想法,以便測試可以作為一種文檔形式。 我不喜歡讓我的模擬承擔雙重責任,我想讓我的模擬簡單地保持為“模擬”。 回到我的問題。

什么是首選方式,使用Mockito.when結合Mockito.verify或僅Mockito.when

When 定義 Mock 的行為 - 以聲明方式定義當使用不同參數調用方法時 mock 將響應的方式。 Verify 用於檢查 Mock 是否已通過各種方式進行交互。

這里有一些Mockito官方文檔的網址,希望對你有所幫助。

可能值得搜索一些其他示例。

我認為這個問題已經在https://stackoverflow.com/a/35301264/473064中得到了解答。

總結是:

簡而言之,僅顯式驗證不能從精心設計的存根和后置條件斷言中隱含的交互被認為是良好的 Mockito 風格。 它們可能是對其他不可測量的副作用的良好調用——記錄代碼、線程執行器、ArgumentCaptors、多方法調用、回調函數——但通常不應應用於存根交互。

我要補充的一點是,有時如果我們想要執行verifyZeroInterations以確保不會發生意外調用,我們必須首先通過verify耗盡已知調用。

我通常做的是盡可能一般地執行最簡單的verify(mock, times(n)).someMethod(anyClass())而不重復我已經在存根中指定的更具體的參數匹配,這減少了重復盡可能多。

例子:

when(someObject.someMethod(eq("abc"))).thenReturn(someValue);
when(someObject.someMethod(eq("def"))).thenReturn(otherValue);
when(someObject.someMethod(endsWith("suffix"))).thenReturn(anotherValue);

var bar = foo();

assertEquals(expectedBar, bar);

verify(someObject, times(3)).someMethod(anyString());
verifyZeroInteractions(someObject);

關於您在評論中的擔憂:

我看到的問題是,如果新開發人員閱讀測試,他們不會知道 subbed 方法是驗證過程的一部分。

存根方法不是驗證過程的一部分。 它是測試用例設置的一部分,即Given步驟。

我認為你的例子可能有點誤導。 來自foo()的最終 output 通常是來自someMethod的響應的轉換,即示例中的someValue 因此,如果存根方法沒有被調用並返回正確的值,測試無論如何都會失敗。 然后,所述開發人員必須查看 mocking 並了解測試用例的工作原理。

在下面更新的示例中,無需驗證someMethod是否被調用,因為如果它沒有被調用,斷言就會失敗。

Mockito.when(someClass.someMethod(someParam)).thenReturn(someValue);
var bar = foo() // SUT: ends upp calling someMethod somewhere in the stack
var expectedValue = // a value depending on `someValue`
assertThat(bar).isEqualTo(expectedValue);

暫無
暫無

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

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