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

时间:2012-10-12 15:44:46

标签: java tdd mockito

如何验证某个方法在对象的依赖项上被 调用?

例如:

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??**
    }
}

5 个答案:

答案 0 :(得分:871)

更有意义:

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",而never javadoc是here

答案 1 :(得分:94)

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

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

答案 2 :(得分:15)

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

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

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

此外,我发现我经常忘记检查&#34;没有互动&#34;只是为了后来才发现事情被调用的事情本来就不应该。

因此,我发现此模式对于捕获未经特别验证的所有意外调用非常有用。

答案 3 :(得分:5)

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

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

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

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

答案 4 :(得分:1)

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

import static org.mockito.Mockito.*;

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

更干净
verify(yourMock, times(0)).someMethod();

整个测试方法,在其他测试中,您可以使用它断言一定数量的执行,如下所示:

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

替代方法是:

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

或者-当您确实要确定某个模拟对象实际上根本没有被调用时-您可以使用:

verifyZeroInteracions(yourMock)