验证是否使用mockito调用了三种方法之一

时间:2011-04-08 11:52:02

标签: java unit-testing mockito

我有三种方法,如:

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 Matcher:

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

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

我有两个问题:

  1. 我该如何解决这个问题?
  2. 有没有办法检查是否调用了两种方法中的任何一种?想象一下,我有另一个名为method2和method3的方法。我想检查是否有任何一个被调用(但至少有一个)。
  3. 感谢。

3 个答案:

答案 0 :(得分:8)

如果调用任何方法,可以使用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的文档。

答案 1 :(得分:2)

vararg方法有这样的签名:

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

你的方法都不是vararg方法。

我不知道Mockito所以我无法解决你的问题,但除非你使用反射,否则上述所有三种方法都没有可能的抽象,所以我猜你必须为每个方法使用不同的情况以上方法。

答案 2 :(得分:0)

您可以拦截对象上的所有调用,例如: 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);

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