关于java:如何验证未使用Mockito调用特定方法?

How to verify that a specific method was not called using Mockito?

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

例如:

1
2
3
4
5
6
7
8
9
public interface Dependency {
    void someMethod();
}

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

使用FOO测试:

1
2
3
4
5
6
7
8
9
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??**
    }
}

更有意义的是:

1
2
3
4
5
6
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

// ...

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

此功能的文档在第4节"验证调用的确切数量/至少x/never",这里是neverjavadoc。


使用Mockito.verify方法的第二个参数,如:

verify(dependency, Mockito.times(0)).someMethod()


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

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

然后测试可以自由地验证应该调用什么。

此外,我发现我经常忘记检查"没有互动",只是后来发现被调用的东西不应该被调用。

所以我发现这个模式对于捕捉所有未经特别验证的意外呼叫很有用。


verifyNoMoreInteractions()verifyZeroInteracions()方法的内部实现与以下方法相同:

1
2
3
4
5
6
7
8
9
public static transient void verifyNoMoreInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

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

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