本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:mockito.verify()方法的参数
我已经对此进行了谷歌搜索,但没有发现任何相关信息。 我有这样的问题:
Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);
Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();
现在,我想验证在runtestmethod方法内部被调用的mymethod(Object o),是否与对象o(而不是其他对象)一起被调用。 但是无论我传入什么参数进行验证,我都会始终通过测试,例如:
Mockito.verify(mock.mymethod(Mockito.eq(obj)));
或者
Mockito.verify(mock.mymethod(Mockito.eq(null)));
或者
Mockito.verify(mock.mymethod(Mockito.eq("something_else")));
我怎么才能正确实现验证的目的?
回答1:
您是否正在尝试使用对象的.equals方法进行判断两个对象是否相等? 您可以利用Mockito中包含的argThat匹配器来完成此操作
import static org.mockito.Matchers.argThat
接下来,您可以实现自己的参数匹配器,该参数匹配器将根据每个对象的.equals方法实现
private class ObjectEqualityArgumentMatcher<T> extends ArgumentMatcher<T> {
T thisObject;
public ObjectEqualityArgumentMatcher(T thisObject) {
this.thisObject = thisObject;
}
@Override
public boolean matches(Object argument) {
return thisObject.equals(argument);
}
}
现在,使用您的代码:
Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj)).thenReturn(null);
Testeable obj = new Testeable();
obj.setMockeable(mock);
command.runtestmethod();
verify(mock).mymethod(argThat(new ObjectEqualityArgumentMatcher<Object>(obj)));
如果您只是为了实现完全相等(内存中的同一对象),则只需执行
verify(mock).mymethod(obj);
这会证明他被调用过一次。