【发布时间】:2016-08-04 21:07:46
【问题描述】:
我遇到了 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 方法抛出的示例。
【问题讨论】:
-
请发帖minimal reproducible example。不应在此处调用该方法。
-
我建议你看看这个讨论相同问题的线程:stackoverflow.com/questions/3467801/…
-
问题可能是因为
external.component.ClassToMock是抽象的 -
如果超类不是本地包,那也不是问题。
标签: java unit-testing inheritance mockito