51

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

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

我想打电话myObject.myMethod()核实一下someMethodOrOther() 没有被调用 - 使用任何参数组合。

例如:

myObject.doSomeStuff();

verify(myMockedOtherObject, never()).someMethodOrOther();

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

4

3 回答 3

90

您可以使用 Mockito 的参数匹配器完成您想要的操作:

myObject.doSomeStuff();

verify(myMockedOtherObject, never()).someMethodOrOther(
    Mockito.anyString(),
    Mockito.anyString()
);

您可以使用像 forverifynever.

于 2013-10-10T18:32:41.360 回答
20

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

假设你的方法是

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

您的验证语句可能如下所示。

verify(myMock, never()).myMethod(
    anyString(), anyInt(), any(MyClass.class), anyListOf(MyClass.class));

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

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

还有一些其他的,我强烈建议您简要浏览一下 Javadoc。但这些是您最有可能与never().

于 2013-10-12T07:38:36.267 回答
0

提出解决方案的更清晰的方式

import static org.mockito.Mockito.verify;

import static org.mockito.Mockito.never;

//Testing scenario

verify(mockObject, never()).someMethod(mockParam1, MockParam2);
于 2018-05-22T21:44:04.933 回答