Mockito v1和v2之间ArgumentCaptor的差异

时间:2016-12-14 12:41:25

标签: java unit-testing junit mockito

我目前正在将旧项目的单元测试从Mockito v1升级到Mockito v2。

在其中一个单元测试中,我有以下代码:

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

两者&#34;验证&#34;没关系但由于我一直在使用Mockito v2,list_mess有不同的值:

  • 在mockito v1中:在A行,list_mess的大小是5个元素,在B行是10个元素
  • 在mockito v2中:在A行,list_mess的大小是5个元素,在B行是5个元素。前5个元素已被删除。然后单元测试失败,因为代码的下一部分需要一个大小为10的列表。

是否有人对此行为有解释?在这一点上,我在Mockito wiki上找不到任何东西。根据&#34;捕获&#34;的javadoc方法,list_mess大小应该仍然是10:

  

用它来捕获参数。此方法必须在验证中使用

     

在内部,此方法注册{@link ArgumentMatcher}的特殊实现。

     

此参数匹配器存储参数值,以便您以后可以使用它来执行断言。

1 个答案:

答案 0 :(得分:1)

实际上这是Mockito团队的一个已知错误:https://github.com/mockito/mockito/pull/819