当在子类上使用Mockito spy抛出异常时,在抽象类中调用可变长度参数方法

时间:2014-02-08 01:58:43

标签: 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)
      {
          //.....
      }
}

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()中调用真实方法。有人可以解释是否是因为使用带有间谍的可变长度参数的方法吗?

1 个答案:

答案 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之间有太多巨大的变化,它不应该太痛苦。