9.7 mockito.verify()方法的参数| Java Debug 笔记

2,194 阅读1分钟

本文正在参加「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);

这会证明他被调用过一次。