【问题标题】:Verify whether one of three methods is invoked with mockito验证是否使用 mockito 调用了三种方法之一
【发布时间】:2011-04-08 11:52:01
【问题描述】:

我有如下三种方法:

public void method1(String str){
    ...
}

public void method1(String str, String str2, String str3){
    ...
}

public void method1(String str, String str2, Object[] objs, String str3){
    ...
}

如果调用了这些方法中的任何一个,我想检查 Mockito,所以我尝试使用 anyVararg 匹配器:

verify(foo).method1(anyVararg());

但这不会编译“Errors 类型中的方法 method1(String, String) 不适用于参数 (Object)”

我有两个问题:

  1. 我该如何解决这个问题?
  2. 有什么方法可以检查是否调用了两种方法中的任何一种?想象一下,我有另一个名为 method2 和 method3 的方法。我想检查是否调用了它们中的任何一个(但至少有一个)。

谢谢。

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    如果调用了任何方法,您可以使用Answer 来增加计数器。

    private Answer incrementCounter = new Answer() {
        public Object answer(InvocationOnMock invocation) throws Throwable {
            counter++;
            return null;
        }        
    };
    

    请注意,您需要存根所有方法。方法的唯一性基于其签名,而不仅仅是方法名称。同名的两个方法仍然是两个不同的方法。

    doAnswer(incrementCounter).when(mockObj.method1(anyString()));
    doAnswer(incrementCounter).when(mockObj.method1(anyString(), anyString()));
    doAnswer(incrementCounter).when(mockObj.method2(anyString()));
    

    请参阅doAnswer here 的文档。

    【讨论】:

    • doAswer 方法是什么,它是 Mockito 的一部分吗?
    • @AbdenaceurLichiheb 是的,它是静态方法org.mockito.Mockito.doAnswer
    【解决方案2】:

    可变参数方法的签名如下:

    public void myMethod(String ... arguments){}
    

    您的方法都不是可变参数方法。

    我不知道 Mockito,所以我无法为您解决问题,但是除非您使用反射,否则上述所有三种方法都没有可能的抽象,所以我想您必须为每种方法使用单独的案例以上方法。

    【讨论】:

    【解决方案3】:

    您可以像在这个答案中那样拦截对对象的所有调用: Mockito - intercept any method invocation on a mock 然后将其与@Bozho 建议的方法结合起来:

    private Answer incrementCounter = new Answer() {
        public Object answer(InvocationOnMock invocation) throws Throwable {
            if (invocation.getMethod().getName().eqauls("someMethid")) {
                counter++;
            }
            return null;
        }        
    };
    
    VendorObject mockObj = mock(SomeClass.class, incrementCounter);
    

    注意:如果您为任何此方法提供其他拦截器 - 默认将不会被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-24
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      相关资源
      最近更新 更多