我遇到了Mockito尝试在存根时调用真实方法的问题。我认为这可能与继承该方法有关。这是我系统外部的组件,不能做太多事情。但是让我们看一下代码
AbstractRpcClient abstractRpcClient = mock(AbstractRpcClient.class);
doNothing().when(abstractRpcClient).callOnce(anyString(), anyVararg());
由于callOnce
在其他对象上调用方法,因此我在第二行获得了NPE。AbstractRpcClient
继承自另一个抽象类,但是该类是本地程序包,因此我什至无法在存根中进行强制转换。
有什么我可以做的吗?我如何才能在不调用真实方法的情况下使该方法不执行任何操作或引发异常。
我是否必须在测试和重写方法中扩展此类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,实际上已经被报告,并且应该在一年前就已修复:
https://github.com/mockito/mockito/issues/168
我在1.9.5版和最新的1.10.19版中得到了相同的(中断)行为。
我建议您使用Mockito引发该错误。
作为临时的解决方法,有几种选择:
public void callOnce() { super.callOnce(); }
子类本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句