Java 在存根时,Mockito从超类调用实方法
Mockito在存根时试图调用real方法,我遇到了问题。我想这可能与方法被继承有关。 这是我的系统外部的组件,不能做太多。但是让我们来看看代码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
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里程碑中。这两个类都来自外部组件,但我刚刚创建了另一个子类来重写这个方法。