确保为List中的每个对象调用一次方法

时间:2015-03-12 07:33:57

标签: java mockito

我在List<MyClass> myObjects中有一堆对象,它们应该用作模拟对象上方法调用的参数。我想验证相应的方法是否为myObjects中的每个实例调用一次,如

Iterator<MyClass> it = myObjects.iterator();
while(it.hasNext()) {
    MyClass myCurrentObj = it.next();
    Mockito.verify(myMock).add(myCurrentObj); //fail here:
}

通过这段代码,我得知我的电话没有完成,但模拟的其他互动发生了。如果我使用Matchers.any(MyClass.class),情况并非如此。可能是因为模拟上的方法调用与相应的参数没有相同的顺序。

如何验证myObjects中的每个条目都调用了一次方法?

1 个答案:

答案 0 :(得分:2)

一种方法是使用ArgumentCaptor来收集调用模拟的所有值:

final int nrElements = myObjects.size();
final ArgumentCaptor<MyClass> captor = ArgumentCaptor.forClass(MyClass.class);

verify(theMock, times(nrElements)).add(captor.capture());

// This is using assertJ

assertThat(captor.getAllValues()).isEqualTo(myObjects);

副作用是,这将检查调用顺序,因为捕获者将按顺序添加捕获的值。