使用 Mockito 验证是否调用了三种方法中的一种

13

我有三个像这样的方法:

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个回答

9

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

doAnswer方法是什么,它是否属于Mockito? - Abdennacer Lachiheb
1
@AbdenaceurLichiheb 是的,这是静态方法 org.mockito.Mockito.doAnswer - z7sg Ѫ

2
一个可变参数方法的签名如下:
public void myMethod(String ... arguments){}

你没有任何一个方法是vararg方法。

我不了解Mockito,所以无法为您解决问题。除非使用反射,否则不可能在上述三个方法之上进行任何抽象化,因此我猜您将不得不针对每个上述方法使用单独的情况。


哦,好的,谢谢。我误解了http://docs.mockito.googlecode.com/hg/org/mockito/Matchers.html#anyVararg()上的示例。是否有任何方法可以检查是否调用了这些方法中的任何一个? - Juanillo

0
您可以像这个答案中所示一样拦截对象上的所有调用: Mockito - 拦截模拟对象上的任何方法调用 然后将其与@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);

注意:如果您为这些方法中的任何一个提供了其他拦截器,则默认拦截器将不会被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接