我在谷歌上搜索了一下,但没有找到任何相关信息。我得到了这样的东西:

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

or

Mockito.verify(mock.mymethod(Mockito.eq(null)));

or

Mockito.verify(mock.mymethod(Mockito.eq("something_else")));

我总是通过考试。我如何完成验证(如果可能的话)?

谢谢你!


当前回答

另一个方法是使用org.mockito.internal.matchers.Equals.Equals方法,而不是重新定义一个方法:

verify(myMock).myMethod((inputObject)Mockito.argThat(new Equals(inputObjectWanted)));

其他回答

另一个方法是使用org.mockito.internal.matchers.Equals.Equals方法,而不是重新定义一个方法:

verify(myMock).myMethod((inputObject)Mockito.argThat(new Equals(inputObjectWanted)));
Verify(a).aFunc(eq(b))

在伪代码:

在实例中,一个名为aFunc的函数被调用。 验证这个调用得到了一个等于b的参数。

如果你不使用其他匹配器,你就不需要eq匹配器。 您使用的语法不正确—您的方法调用应该在.verify(mock)之外。您现在正在对方法调用的结果发起验证,而没有验证任何东西(没有进行方法调用)。因此所有测试都通过了。

你的代码应该是这样的:

Mockito.verify(mock).mymethod(obj);
Mockito.verify(mock).mymethod(null);
Mockito.verify(mock).mymethod("something_else");

你也可以使用TypeSafeDiagnosingMatcher

    private Matcher<GetPackagesRequest> expectedPackageRequest(final AvailabilityRequest request) {
    return new TypeSafeDiagnosingMatcher<GetPackagesRequest>() {

        StringBuilder text = new StringBuilder(500);

        @Override
        protected boolean matchesSafely(GetPackagesRequest req, Description desc) {
            String productCode = req.getPackageIds().iterator().next().getValue();
            if (productCode.equals(request.getSupplierProductCode())) {
                text.append("ProductCode not equal! " + productCode + " , " + request.getSupplierProductCode());
                return true;
            }

            text.append(req.toString());
            return false;
        }

        @Override
        public void describeTo(Description d) {
            d.appendText(text.toString());
        }
    };
}

然后验证调用:

Mockito.verify(client).getPackages(Mockito.argThat(expectedPackageRequest(request)));

你检查过mockable类的equals方法了吗?如果这个方法总是返回true,或者你对同一个实例测试同一个实例,而equal方法没有被覆盖(因此只检查引用),那么它返回true。