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

标签 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 中的每个条目都调用了该方法一次?

最佳答案

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

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

关于java - 确保为列表中的每个对象调用一次方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29004150/

相关文章:

java - 如何使 "provided"范围在 Android Studio 上工作?

java - 有没有办法为 OpenNLP 获取 "original"文本数据?

java - org.apache.http.impl.client.DefaultRequestDirector 方法executeSB (Galaxy S5)

java - 从模拟类调用方法时 Mockito : java. lang.NullPointerException

java - 如何模拟静态公共(public)类的构造函数以引发异常

java - 在tomcat上发布时请求的资源不可用

java - 我可以为动态数组列表父类(super class)类型对象创建子类对象吗?

java - 如何模拟环境接口(interface)

java - 无法让mockito模拟公共(public)类的公共(public)方法

java - 摩基托 : How to Verify that a parameter is an Object with a specific parameter?