bel*_*hin 563 java tdd mockito
如何验证是否未在对象的依赖项上调用方法?
例如:
public interface Dependency {
void someMethod();
}
public class Foo {
public bar(final Dependency d) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
通过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??**
}
}
Run Code Online (Sandbox Code Playgroud)
Bri*_*ice 983
更有意义的是:
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
// ...
verify(dependency, never()).someMethod();
Run Code Online (Sandbox Code Playgroud)
该功能的文档是§4"验证确切的调用次数/至少x/never",neverjavadoc就在这里.
bel*_*hin 104
在Mockito.verify方法上使用第二个参数,如:
verify(dependency, Mockito.times(0)).someMethod()
Dav*_*der 18
作为一个更普遍的模式,我倾向于@After在测试中使用一个块:
@After
public void after() {
verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}
Run Code Online (Sandbox Code Playgroud)
然后测试可以自由地仅验证应该调用的内容.
此外,我发现我经常忘记检查"没有互动",只是为了后来发现事情被称为不应该被调用.
因此,我发现此模式对于捕获未经过特别验证的所有意外调用非常有用.
fl0*_*l0w 14
首先:您应该始终导入 mockito static,这样代码将更具可读性(和直观):
import static org.mockito.Mockito.*;
Run Code Online (Sandbox Code Playgroud)
实际上有很多方法可以实现这一点,但是(可以说)使用
verify(yourMock, times(0)).someMethod();
Run Code Online (Sandbox Code Playgroud)
整个测试中的方法,当在其他测试中使用它来断言一定数量的执行时,如下所示:
verify(yourMock, times(5)).someMethod();
Run Code Online (Sandbox Code Playgroud)
替代方案是:
verify(yourMock, never()).someMethod();
Run Code Online (Sandbox Code Playgroud)
或者 - 当你真的想确保某个模拟对象实际上根本没有被调用时 - 你可以使用:
verifyZeroInteractions(yourMock)
Run Code Online (Sandbox Code Playgroud)
请注意:不推荐使用 verifyZeroInteractions(Object... mocks)。从 3.0.1 版开始。现在推荐的方法是:
verifyNoInteractions(yourMock)
Run Code Online (Sandbox Code Playgroud)
这里的verifyNoMoreInteractions()和verifyZeroInteracions()方法都具有相同的实现:
public static transient void verifyNoMoreInteractions(Object mocks[])
{
MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}
public static transient void verifyZeroInteractions(Object mocks[])
{
MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}
Run Code Online (Sandbox Code Playgroud)
所以我们可以在模拟对象或模拟对象数组中使用它们中的任何一个来检查是否没有使用模拟对象调用任何方法.