2016-12-14 55 views
3

我目前正在將舊版項目的單元測試從Mockito v1升級到Mockito v2。Mockito v1和v2之間的ArgumentCaptor之間的差異

在單元測試中的一個,我有以下代碼:

Listener listener = new Listener(); 
Alert alert = new Alert (listener); 
alert.action(); // action calls 5 times the "notify" method on "listener" 

ArgumentCaptor<Mess> argument = ArgumentCaptor.forClass(Mess.class); 
verify(listener, times(5)).notify(argument.capture()); 
List<Mess> list_mess = argument.getAllValues(); // A 

// The test checks list_mess and does some stuff on "alert" 

alert.action(); // action calls 5 times the "notify" method on "listener" 

argument = ArgumentCaptor.forClass(Mess.class); 
verify(listener, times(10)).notify(argument.capture()); 
list_mess = argument.getAllValues(); // B 

兩個 「驗證」 都OK。但是,由於我已用的Mockito v2的工作,list_mess具有不同的值:

  • 在的Mockito V1:在線路A,list_mess的大小爲5個元素,是在B線
  • 10個元件在的Mockito V2 :在A行,list_mess的大小是5個元素,在B行是5個元素。前5個元素已被刪除。然後單元測試失敗,因爲代碼的下一部分需要大小爲10的列表。

有人對此行爲有解釋嗎?在這一點上,我沒有在Mockito wiki上找到任何東西。根據javadoc的「capture」方法,list_mess的大小應該仍然是10:

用它來捕獲參數。必須在驗證內使用此方法

該方法在內部註冊{@link ArgumentMatcher}的特殊實現。

此參數匹配器存儲參數值,以便您稍後可以使用它來執行斷言。

+0

爲什麼會爭論捕獲超過5元,如果'監聽#notify'只調用5倍?如果'Listener#notify'實際上被稱爲10次,那麼列表中的值是該方法的前5次調用的參數,還是第5次,或者其他組合? – Adam

+0

Listener#notify被稱爲10次(每次alert#動作一次) 列表中的參數是第二次調用的5次。 但是我剛剛從Mockito團隊得到了答案,它實際上是一個已知的v2 bug – Ptiseb

回答