[英]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();
}
或者,如果apply
和commit
調用了某個(內部) save
方法,則您也可以嘗試驗證該方法(假設它已公開-基於模擬的測試可能與信息隱藏不符)。 或者,如果您可以控制要測試的代碼,則可以按照以下方式進行重構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.