簡體   English   中英

如何驗證Mockito是否滿足許多條件? 是否可以驗證是否調用了一個或另一個方法?

[英]How to verify one from many conditions is satisfied on Mockito? Is it possible to verify if one OR another method was called?

在單元測試中,我想檢查是否調用了一個或另一個方法。 由於Mockito,我可以輕松地驗證一些方法被調用了多少次,但是verify沒有像“ OR”這樣的驗證模式。 任何解決方法?

在我的情況下,我想檢查在SharedPreferences.Editor是否名為.apply().commit()因為這兩種可能性使我滿意並保存了數據。 不幸的是,如果我調用verify(mEditor).apply()但由於即時保存的要求,有人將實現更改為.commit() ,則測試將失敗,但不應這樣做,因為我只想從這一點進行測試查看是否保存數據。 它是單元測試,應該獨立於此類更改,並且僅檢查內部測試的范圍。

我不知道這樣做的好方法,老實說,我認為真正的答案是: 要這樣做。 是的,另一個答案顯示了一種實現您所要求的方法,但是然后:

您知道生產代碼應該做什么。 含義:與其編寫允許“ this that”的單個驗證代碼,不如編寫兩個獨立的測試,一個用於“ this”,一個用於“ that”。

換句話說:您可以控制測試內容。 因此,編寫一個應導致apply() ,並編寫一個應導致commit() 然后, verify()每個測試都希望看到的一種情況!

單元測試應該簡單明了。 當某件事失敗時,您可以快速查看單元測試,並且您已經知道在生產代碼中可以查找到根本原因的位置。 任何會增加測試復雜性的事情都可能使之變得更加困難。 最好有兩個遵循清晰的“何時驗證”路徑的測試,而不是具有一個(或多個)“然后驗證或驗證”的測試。

您要求解決的問題是捕獲基礎MockitoAssertionError (或僅是AssertionError ):

try {
  verify(mEditor).apply();
} catch (MockitoAssertionError mae) {
  // apply was not called. Let's verify commit instead.
  verify(mEditor).commit();
}

或者,如果applycommit調用了某個(內部) save方法,則您也可以嘗試驗證該方法(假設它已公開-基於模擬的測試可能與信息隱藏不符)。 或者,如果您可以控制要測試的代碼,則可以按照以下方式進行重構。

不過,更好的建議是完全避免這樣做,正如@GhostCat回答所指出的那樣

暫無
暫無

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

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