的Mockito。验证方法参数

问题

我用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 赞)

替代ArgumentMatcherisArgumentCaptor

官方例子:

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");