簡體   English   中英

Mockito驗證:在驗證()期間驗證,而不是在模擬方法調用期間驗證

[英]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.

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