如何使用Mockito验证未使用任何参数组合调用的模拟方法

Dan*_*ing 44 java unit-testing mocking mockito

如何使用Mockito验证模拟方法根本没有被调用 - 使用任何参数组合?

例如,我有一个对象 - myObject使用第二个模拟对象 - myMockedOtherObject有一个方法 - someMethodOrOther(String parameter1, String parameter2).

我想调用myObject.myMethod()并验证someMethodOrOther() 不会被调用 - 使用任何参数组合.

例如:

myObject.doSomeStuff();

verify(myMockedOtherObject, never()).someMethodOrOther();
Run Code Online (Sandbox Code Playgroud)

除非我不能这样做,因为someMethodOrOther()需要提供特定的参数.

Mat*_*man 82

你可以用Mockito的论证匹配器来完成你想要的东西:

myObject.doSomeStuff();

verify(myMockedOtherObject, never()).someMethodOrOther(
    Mockito.anyString(),
    Mockito.anyString()
);
Run Code Online (Sandbox Code Playgroud)

当然你也可以做一个小更简洁与静态导入像你有verifynever.

  • OP:`never()`对于特定的方法调用是确保不调用该方法的最佳方法.如果您已经验证了所有其他方法调用,或者没有其他方法调用,那么您还可以使用`verifyNoMoreInteractions(...)`和`verifyZeroInteractions(...)`; 但是,这些可能会使你的测试比你想要的更脆弱,所以它们不如Matt的解决方案那么好. (6认同)

Daw*_*ica 17

你需要使用参数匹配器来做这样的事情.您提供了一个参数匹配器来对应方法中的每个参数,但您必须确保选择一个具有正确类型的参数.您可能需要的所有内容都列在http://docs.mockito.googlecode.com/hg/latest/org/mockito/Matchers.html.

假设你的方法是

public void myMethod(
    String text, int count, MyClass something, List<MyClass> someList) {
    // ...
}  
Run Code Online (Sandbox Code Playgroud)

您的验证声明可能如下所示.

verify(myMock, never()).myMethod(
    anyString(), anyInt(), any(MyClass.class), anyListOf(MyClass.class));
Run Code Online (Sandbox Code Playgroud)

您可能需要的一些匹配器是 -

  • anyInt(), anyLong(), anyShort(), anyBoolean(), anyByte(), anyChar(), anyFloat(), anyDouble() - 这些匹配每种类型的原始版本或对象版本.在我的例子中,我曾经习惯anyInt()匹配一个int,但它也会匹配一个Integer.
  • any(XXX.class) - 这将匹配任何对象类型.在我的例子中,我用它来匹配a MyClass.
  • anyString() - 这是另一种写作方式 any(String.class)
  • anyListOf(XXX.class), anySetOf(XXX.class), anyMapOf(XXX.class, XXX.class) - 这些适用于匹配标准通用集合类型.在我的例子中,我曾经习惯于anyListOf匹配List<MyClass>.

还有一些其他人,我强烈建议您通过Javadoc进行简短的浏览.但这些是你最有可能使用的never().