【问题标题】:Call Variable length argument method in abstract class when using Mockito spy on subclass throws exception在子类上使用 Mockito spy 时调用抽​​象类中的可变长度参数方法引发异常
【发布时间】:2014-02-08 01:58:42
【问题描述】:

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

【问题讨论】:

    标签: java mockito variadic-functions


    【解决方案1】:

    这是 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 版可以使上述运行正常,而且您还可以得到如您所说的可变参数匹配器(尽管请注意,您的问题与匹配器无关,而是 Mockito 如何处理间谍可变参数方法)。

    我认为1.8.0和1.9.5之间没有太多巨大的变化,应该不会太痛苦。

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多