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

Jua*_*llo 11 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){
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想检查Mockito是否调用了这些方法,所以我尝试使用anyVararg Matcher:

verify(foo).method1(anyVararg());
Run Code Online (Sandbox Code Playgroud)

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

我有两个问题:

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

谢谢.

z7s*_*g Ѫ 8

Answer如果调用任何方法,可以使用an 来递增计数器.

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

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

doAnswer(incrementCounter).when(mockObj.method1(anyString()));
doAnswer(incrementCounter).when(mockObj.method1(anyString(), anyString()));
doAnswer(incrementCounter).when(mockObj.method2(anyString()));
Run Code Online (Sandbox Code Playgroud)

请参阅doAnswer 此处的文档.


Sea*_*oyd 2

可变参数方法具有如下签名:

public void myMethod(String ... arguments){}
Run Code Online (Sandbox Code Playgroud)

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

我不了解 Mockito,所以我无法为您解决您的问题,但是除非您使用反射,否则不可能对上述所有三种方法进行抽象,所以我想您将不得不对上述每种方法使用单独的情况方法。