问题
我用Google搜索了这个,但没有发现任何相关内容。我有这样的事情:
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();
现在,我想验证那个名为insideruntestmethod()
的mymethod(Object o)
是用Objecto
调用的,而不是其他任何调用。但是我总是通过测试,无论我在验证上做什么,例如:
Mockito.verify(mock.mymethod(Mockito.eq(obj)));
要么
Mockito.verify(mock.mymethod(Mockito.eq(null)));
要么
Mockito.verify(mock.mymethod(Mockito.eq("something_else")));
我总是通过考试。如何完成验证(如果可能)?
谢谢。
#1 热门回答(173 赞)
替代ArgumentMatcher
isArgumentCaptor
。
官方例子:
ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
verify(mock).doSomething(argument.capture());
assertEquals("John", argument.getValue().getName());
也可以使用@Captor注释定义捕获者:
@Captor ArgumentCaptor<Person> captor;
//... MockitoAnnotations.initMocks(this);
@Test public void test() {
//...
verify(mock).doSomething(captor.capture());
assertEquals("John", captor.getValue().getName());
}
#2 热门回答(50 赞)
你是否尝试使用对象的.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)));
如果你只是想要EXACT相等(内存中的相同对象),那就去做吧
verify(mock).mymethod(obj);
这将验证它被调用一次。
#3 热门回答(43 赞)
- 如果不使用其他匹配器,则不需要eq匹配器。
- 你没有使用正确的语法 - 你的方法调用应该在.verify(mock)之外。你现在正在启动对方法调用结果的验证,而无需验证任何内容(不进行方法调用)。因此所有测试都在通过。
你的代码应如下所示:
Mockito.verify(mock).mymethod(obj);
Mockito.verify(mock).mymethod(null);
Mockito.verify(mock).mymethod("something_else");