796

如何验证没有在对象的依赖项上调用方法?

例如:

public interface Dependency {
    void someMethod();
}

public class Foo {
    public bar(final Dependency d) {
        ...
    }
}

使用 Foo 测试:

public class FooTest {
    @Test
    public void dependencyIsNotCalled() {
        final Foo foo = new Foo(...);
        final Dependency dependency = mock(Dependency.class);
        foo.bar(dependency);
        **// verify here that someMethod was not called??**
    }
}
4

5 回答 5

1339

更有意义:

import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

// ...

verify(dependency, never()).someMethod();

此功能的文档在§4 "Verifying exact number of invocations / at least x / never"中,neverjavadoc 在这里

于 2012-10-12T16:08:03.190 回答
137

在方法上使用第二个参数Mockito.verify,如下所示:

Mockito.verify(dependency, Mockito.times(0)).someMethod()
于 2012-10-12T15:44:46.263 回答
25

作为一个更通用的模式,我倾向于@After在测试中使用一个块:

@After
public void after() {
    verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}

然后测试可以自由地验证应该调用的内容。

此外,我发现我经常忘记检查“无交互”,后来才发现调用了不应该调用的东西。

所以我发现这种模式对于捕获所有未经过特别验证的意外调用很有用。

于 2015-03-03T14:54:02.150 回答
18

首先:您应该始终导入 mockito static,这样代码将更具可读性(和直观性):

import static org.mockito.Mockito.*;

实际上有很多方法可以实现这一点,但是(可以说)使用

verify(yourMock, times(0)).someMethod();

在您的测试中使用方法,当在其他测试中使用它来断言一定数量的执行时,如下所示:

verify(yourMock, times(5)).someMethod();

替代方案是:

verify(yourMock, never()).someMethod();

或者-当您真的想确保实际上根本没有调用某个模拟对象时-您可以使用:

verifyZeroInteractions(yourMock)

请注意:verifyZeroInteractions(Object... mocks) 已弃用。从 3.0.1 版开始。现在推荐的方法是:

verifyNoInteractions(yourMock)
于 2019-10-24T13:34:04.453 回答
11

和方法在内部具有相同的实现verifyNoMoreInteractions()verifyZeroInteractions()

public static transient void verifyNoMoreInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

public static transient void verifyZeroInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

所以我们可以在模拟对象或模拟对象数组上使用它们中的任何一个来检查是否没有使用模拟对象调用任何方法。

于 2016-03-22T12:57:39.587 回答