2013-10-10 45 views
24

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

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

我想打电话给myObject.myMethod()并验证someMethodOrOther()被调用 - 与任何的参数组合。

例如为:

myObject.doSomeStuff(); 

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

除了我不能这样做,因为someMethodOrOther()要求提供具体参数。

回答

55

可以完成你想要的Mockito的说法匹配器是什么:

myObject.doSomeStuff(); 

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

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

+6

OP:'never()'对于特定的方法调用是确保方法未被调用的最佳方法。如果您已经验证了所有其他方法调用,或者没有其他方法调用,那么您还有'verifyNoMoreInteractions(...)'和'verifyZeroInteractions(...)'在你的处置;但是,这些可以使你的测试比你想要的更脆弱,所以它们不如Matt的解决方案。 –

12

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

相关问题