我使用的是Mockito 1.8.0,所以我没有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
,因为它无法找到模拟,它会抛出java.lang.reflect.InvocationTargetException
。
我不希望嘲笑foo()
。我想要在someMethod()
中调用真实方法。有人可以解释是否是因为使用带有间谍的可变长度参数的方法吗?
答案 0 :(得分:2)
这是Mockito的一个错误。
https://groups.google.com/forum/#!msg/mockito/P_xO5yhoXMY/FBeS4Nf4X9AJ
你的例子很复杂,重现问题很简单:
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之间有太多巨大的变化,它不应该太痛苦。