【问题标题】:How to verify mocked method not called with any combination of parameters using Mockito如何使用 Mockito 验证未使用任何参数组合调用的模拟方法
【发布时间】:2013-10-18 14:14:24
【问题描述】:

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

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

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

例如:

myObject.doSomeStuff();

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

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

【问题讨论】:

    标签: java unit-testing mocking mockito


    【解决方案1】:

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

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

    您可以像 verifynever 那样使用静态导入来减少冗长。

    【讨论】:

    • OP: never() 对特定方法的调用是确保该方法未被调用的最佳方式。如果您已验证所有其他方法调用,或者没有其他方法调用,您还可以使用verifyNoMoreInteractions(...)verifyZeroInteractions(...);但是,它们会使您的测试变得比您想要的更脆弱,因此它们不如 Matt 的解决方案。
    • 我知道这个答案有多老了,但我似乎无法找到never()。但是,times(0) 似乎可用。
    【解决方案2】:

    你需要使用参数匹配器来做这样的事情。您提供一个参数匹配器来对应您方法中的每个参数,但您必须确保选择一个具有正确类型的参数。 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&lt;MyClass&gt;

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

    【讨论】:

    • 值得一提的是,还有一个any(),您可以将其用于对象,而不必键入类。
    【解决方案3】:

    更清晰的解决方案展示方式

    import static org.mockito.Mockito.verify;
    
    import static org.mockito.Mockito.never;
    
    //Testing scenario
    
    verify(mockObject, never()).someMethod(mockParam1, MockParam2);
    

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 2017-02-18
      • 2021-07-24
      • 2017-07-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      相关资源
      最近更新 更多