问题很简单......
// Class Under Test
list.add(1);
dependency.handleList(list);
list.clear();
list.add(2);
dependency.handleList(list);
//Test Code
verify(mockDepenency, times(2)).handleList(argumentCaptor.capture());
List<Collection<Integer>> list = argumentCaptor.getAllValues();
assertEquals(1, list.get(0).get(0)); // fails value is 2
原因似乎与Mockito捕捉争论的方式有关。也就是说,它通过引用捕获所有参数。这似乎与this issue有关。
理想情况下,我希望能够在捕获时指定副本/克隆,但我没有看到这样做的方法。是否有我缺少的替代品?
答案 0 :(得分:2)
如果您要向正在测试的班级提供list
,您也可以模拟它并对其进行验证,例如:
final List<Integer> list = spy(List.class);
... act...
final InOrder inOrder = inOrder(list, mockDependency);
inOrder.verify(list).add(1);
inOrder.verify(mockDependency).handleList(list);
inOrder.verify(list).clear();
inOrder.verify(mockDependency).handleList(list);
inOrder.verify(list).add(2);
但是,我不确定这种方法如何能够阻止您的实际测试。
编辑:根据whaley的评论从mock
更改为spy
。