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}的特殊實現。
此參數匹配器存儲參數值,以便您稍後可以使用它來執行斷言。
爲什麼會爭論捕獲超過5元,如果'監聽#notify'只調用5倍?如果'Listener#notify'實際上被稱爲10次,那麼列表中的值是該方法的前5次調用的參數,還是第5次,或者其他組合? – Adam
Listener#notify被稱爲10次(每次alert#動作一次) 列表中的參數是第二次調用的5次。 但是我剛剛從Mockito團隊得到了答案,它實際上是一個已知的v2 bug – Ptiseb