[英]Mockito Verify: Verified during verify() than during mocked method call
我用方法列表調用方法performAction並驗證相同的方法。 調用此方法后,我修改了一些“對象”。
Mockito驗證失敗說參數不匹配(顯示修改過的對象)但我可以在調試模式下看到對象在需要時是正確的。
理想情況下,這不應該發生,因為應該在實際調用方法時應用驗證。 在測試方法驗證調用期間驗證是否適用於模擬方法調用時?
測試類
@Test
public void test() throws Exception {
List<ABC> objects = new ArrayList<ABC>();
//populate objects.
activity.performActions(objects);
verify(activity, times(1)).doActivity(objects);
}
測試方法:
public void performActions(List<ABC> objects) {
activity.doActivity(urlObjects2PerformAction);
//Modify objects
}
我得到的錯誤如下(這是完整的代碼。我給出了最小的可能代碼段):
Argument(s) are different! Wanted:
activity.doActivity(
.......
......
之前已經問過 - 在Can Mockito根據方法調用時的值驗證參數?
當您調用已經使用Mockito存根的方法時,Mockito將存儲傳遞給它的參數,以便您以后可以使用verify
。 也就是說,它存儲對象引用,而不是對象本身的內容。 如果稍后更改這些對象的內容,則verify
調用將將其參數與更新的對象進行比較 - 它不會生成原始對象的深層副本。
如果您需要驗證對象的內容是什么,則需要使用
正確的方法是使用Mockito Answer
。 因此,對於第二個選項,您將創建一個執行驗證的Answer
,如果參數值不正確,則拋出AssertionFailedError
; 而不是在測試結束時使用verify
。
verify
比較此時的參數內容verify
稱為而不是當該模擬的方法被調用。 如果修改了列表的內容,則verify
將使用修改后的值。
另一種方法是使用Answer
而不是在調用方法時檢查參數,或者您可以創建新列表而不是修改舊列表。
現在可以使用ArgumentCaptor解決這個問題
@Test
public void test() throws Exception {
List<ABC> objects = new ArrayList<ABC>();
ArgumentCaptor<List<ABC> objectsCaptor = ArgumentCaptor<List.class>;
//populate objects.
activity.performActions(objects);
verify(activity, times(1)).doActivity(objectsCaptor.capture());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.