如何验证未使用Mockito调用特定方法?

如何验证一个方法是否被对象的依赖项没有调用?

例如:

public interface Dependency {void someMethod();}
public class Foo {public bar(final Dependency d) {...}}

通过Foo测试:

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

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

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

更有意义的:

import static org.mockito.Mockito.never;import static org.mockito.Mockito.verify;
// ...
verify(dependency, never()).someMethod();

这个特性的留档是§4“验证调用的确切数量/至少x/从不”never的javadoc是这里

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

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

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

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

因此,我发现这种模式对于捕获所有未经专门验证的意外调用很有用。

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

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

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

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

import static org.mockito.Mockito.*;

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

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

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

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

替代品是:

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

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

verifyZeroInteractions(yourMock)

请注意:VerfyZeroInteraction(对象…模拟)已弃用。从3.0.1版开始。现在推荐的方法是:

verifyNoInteractions(yourMock)

作为一个建议,如果你想在语法级别上与行为驱动开发风格更加一致,有BDDMockito

您可以使用:

then(dependency).should(never()).someMethod();

作为以下的等效替代:

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