确保为列表中的每个对象调用一次方法
Make sure method is called once for each object in a List
我在 List<MyClass> myObjects
中有一堆对象,它们应该用作模拟对象的方法调用的参数。我想验证 myObjects
like
中的每个实例是否恰好调用了一次相应的方法
Iterator<MyClass> it = myObjects.iterator();
while(it.hasNext()) {
MyClass myCurrentObj = it.next();
Mockito.verify(myMock).add(myCurrentObj); //fail here:
}
通过这段代码,我得到通知,我的调用没有完成,但是模拟上的其他交互发生了。如果我使用 Matchers.any(MyClass.class)
,情况就不是这样了。可能是因为 mock 上的方法调用与相应参数的顺序不同。
我如何验证该方法对 myObjects
中的每个条目都调用了一次?
一种方法是使用 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);
副作用是这将也检查调用顺序,因为捕获者将按顺序添加捕获的值。
我在 List<MyClass> myObjects
中有一堆对象,它们应该用作模拟对象的方法调用的参数。我想验证 myObjects
like
Iterator<MyClass> it = myObjects.iterator();
while(it.hasNext()) {
MyClass myCurrentObj = it.next();
Mockito.verify(myMock).add(myCurrentObj); //fail here:
}
通过这段代码,我得到通知,我的调用没有完成,但是模拟上的其他交互发生了。如果我使用 Matchers.any(MyClass.class)
,情况就不是这样了。可能是因为 mock 上的方法调用与相应参数的顺序不同。
我如何验证该方法对 myObjects
中的每个条目都调用了一次?
一种方法是使用 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);
副作用是这将也检查调用顺序,因为捕获者将按顺序添加捕获的值。