Java 在子类上使用Mockito spy时调用抽象类中的变长参数方法引发异常
我使用Mockito 1.8.0,因此没有Java 在子类上使用Mockito spy时调用抽象类中的变长参数方法引发异常,java,mockito,variadic-functions,Java,Mockito,Variadic Functions,我使用Mockito 1.8.0,因此没有AnyVararg。升级到Mockito的更高版本目前不在我的团队的考虑范围之内。所以请容忍我 班级的样子: public abstract class Parent { public void someMethod(String a, String b) { //..... } public void foo(String a, String... b) {
AnyVararg
。升级到Mockito的更高版本目前不在我的团队的考虑范围之内。所以请容忍我
班级的样子:
public abstract class Parent {
public void someMethod(String a, String b)
{
//.....
}
public void foo(String a, String... b)
{
//.....
}
}
public class Child extends Parent{
public void bar() {
someMethod(a,b);
foo(a,b,c);
methodToFailUsingSpy();
}
}
单元测试
@Test
public void someTest() {
private spyOfChild = //initialize here;
doReturn("Something")).when(spyOfChild).methodToFailUsingSpy();
/* Tried using this, but did not help.
doCallRealMethod().when(spyOfChild).foo(anyString());
*/
spyOfChild.bar();
}
问题-
当间谍看到someMethod()
时,它调用抽象类中的真实方法。但是当它看到foo()
时,它会试图找到一个匹配的存根方法,即控件转到Mockito的MethodInterceptorFilter
,因为它无法找到一个mock,所以它抛出java.lang.reflect.InvocationTargetException
我不希望
foo()
被嘲笑。我希望调用真正的方法,就像在someMethod()
中发生的那样。有人能解释一下这是不是因为在间谍中使用了具有可变长度参数的方法吗?这是Mockito中的一个bug
您的示例非常复杂,重现问题非常简单:
class SimpleClass {
public String varargsMethod(String... in) {
return null;
}
public void testSpyVarargs() {
SimpleClass sc = Mockito.spy(new SimpleClass());
sc.varargsMethod("a", "b");
}
}
即使这样,也会产生您描述的错误,链接中建议的解决方法对我不起作用
不幸的是,要解决这个问题,您需要升级Mockito。更改为1.9.5版可以使上述运行正常,此外,还可以按照您所说的方式获得varargs匹配器(尽管请注意,您的问题不在于匹配器,而在于Mockito如何处理被监视的varargs方法)
我不认为在1.8.0和1.9.5之间有太多的巨大变化,这应该不会太痛苦