确保对列表中的每个对象调用一次方法



>我在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中的每个条目调用了一次?

一种方法是使用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);

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

相关内容

  • 没有找到相关文章