繁体   English   中英

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

[英]How to verify that a specific method was not called using 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??**
    }
}

更有意义:

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 在这里

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

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

首先:您应该始终导入 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)

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

@After
public 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);
}

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

作为一个建议,如果你想在语法级别上与行为驱动的开发风格更加一致,那么可以使用BDDMockito

你可以使用:

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

作为等效的替代品:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM