Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在存根时,Mockito从超类调用实方法_Java_Unit Testing_Inheritance_Mockito - Fatal编程技术网

Java 在存根时,Mockito从超类调用实方法

Java 在存根时,Mockito从超类调用实方法,java,unit-testing,inheritance,mockito,Java,Unit Testing,Inheritance,Mockito,Mockito在存根时试图调用real方法,我遇到了问题。我想这可能与方法被继承有关。 这是我的系统外部的组件,不能做太多。但是让我们来看看代码 AbstractRpcClient abstractRpcClient = mock(AbstractRpcClient.class); doNothing().when(abstractRpcClient).callOnce(anyString(), anyVararg()); 由于callOnce调用了一些其他对象上的方法,因此我在第二行得到了N

Mockito在存根时试图调用real方法,我遇到了问题。我想这可能与方法被继承有关。 这是我的系统外部的组件,不能做太多。但是让我们来看看代码

AbstractRpcClient abstractRpcClient = mock(AbstractRpcClient.class);
doNothing().when(abstractRpcClient).callOnce(anyString(), anyVararg());
由于
callOnce
调用了一些其他对象上的方法,因此我在第二行得到了NPE。
AbstractRpcClient
继承自另一个抽象类,但这个类是本地包,所以我甚至不能在存根中强制转换它

我能做些什么吗?如何在不调用实际方法的情况下,将此方法存根为不执行任何操作或抛出异常

我必须在test和override方法
callOnce
中扩展这个类吗?这当然有效,但还有其他解决方案吗

最简单的例子:

package external.component;

public abstract class ClassToMock extends SuperClass {

}


abstract class SuperClass {
    public void callOnce(String method, Object... params) {
        throw new RuntimeException("We shouldn't be here");
    }
}
测试班

package mypackage

import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.anyVararg;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;

public class Testclass {

    @Test
    public void test() {
        external.component.ClassToMock classToMock = mock(external.component.ClassToMock.class);
        doNothing().when(classToMock).callOnce(anyString(), anyVararg());
    }

}

当然,在示例中,
RuntimeException
是从
callOnce
方法抛出的。

它看起来像Mockito中的bug,实际上它已经被报告了,并且应该在一年前修复:

我在版本1.9.5和最近的版本1.10.19中得到了相同的(坏的)行为

我建议你用Mockito来解决这个问题

作为临时工作,有以下几种选择:

  • 公开上课
  • 在子类中添加
    public void callOnce(){super.callOnce();}

请张贴一份电子邮件。此处不应调用该方法。我建议您查看讨论同一问题的此线程:该问题可能是因为
external.component.ClassToMock
是抽象的。如果超类不是本地包,则不会有问题。感谢提供信息。它看起来像是在2.0里程碑中。这两个类都来自外部组件,但我刚刚创建了另一个子类来重写这个方法。