2013-08-24 93 views
4

我使用對象列表調用一個方法performAction並驗證它。在調用這個方法之後,我修改了一些「對象」。Mockito驗證:在verify()期間比在模擬方法調用期間驗證

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(
....... 
...... 
+0

將代碼縮減爲再現問題的最短示例,粘貼此示例的完整代碼以及所獲得的確切完整的錯誤消息。 –

+0

@JBNizet修改了這個問題。 – instanceOfObject

回答

7

這種情況以前也有人問 - 當你調用已與存根一的Mockito的方法,將的Mockito存儲傳遞給它的參數,這樣就可以在以後使用verifyCan Mockito verify parameters based on their values at the time of method call?

。也就是說,它存儲對象引用,而不是對象本身的內容。如果稍後更改這些對象的內容,則verify調用將將其參數與更新的對象進行比較 - 它不會對原始對象進行深層複製。

如果您需要確認一下對象的內容是,你要麼需要

  • 將它們存儲在自己的方法調用的時間;或
  • 在方法調用時驗證它們。

正確的做法是使用Mockito Answer。因此,對於第二個選項,您將創建一個執行驗證的Answer,如果參數值不正確,則會拋出AssertionFailedError;而不是在測試結束時使用verify

1

verify比較當時的參數內容verify被調用,而不是當模擬方法被調用時。如果列表內容被修改,則verify將使用修改的值。

另一種方法是使用Answer而不是在調用方法時檢查參數,也可以創建新列表而不是修改舊的列表。