我有三种方法,如:
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)”
我有两个问题:
感谢。
答案 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);
注意:如果为任何此方法提供其他拦截器 - 将不会调用默认值。