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

时间:2013-10-10 17:19:04

标签: java unit-testing mocking mockito

如何使用Mockito验证模拟方法是否完全没有被调用 - 使用任何参数组合?

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

我想通过任何参数组合来调用myObject.myMethod()并验证someMethodOrOther() 是否被调用。

e.g:

myObject.doSomeStuff();

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

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

3 个答案:

答案 0 :(得分:71)

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

myObject.doSomeStuff();

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

当然,对于verifynever的静态导入,您可以使其更加简洁。

答案 1 :(得分:14)

你需要使用参数匹配器来做这样的事情。您提供了一个参数匹配器来对应方法中的每个参数,但您必须确保选择一个具有正确类型的参数。您可能需要的所有内容都列在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()一起使用的。

答案 2 :(得分:0)

更明确地展示解决方案

"CONN","CHANNEL","APPLTAG","USERID","CONNAME","OBJNAME","OBJTYPE","OPENOPTS"