Mockito 在存根时从超类调用真正的方法

Pio*_*otr 5 java inheritance unit-testing mockito

我遇到了 Mockito 试图在存根时调用真实方法的问题。我认为这可能与该方法被继承有关。这是我的系统外部的组件,对此无能为力。但是让我们来看看代码

AbstractRpcClient abstractRpcClient = mock(AbstractRpcClient.class);
doNothing().when(abstractRpcClient).callOnce(anyString(), anyVararg());
Run Code Online (Sandbox Code Playgroud)

由于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");
    }
}
Run Code Online (Sandbox Code Playgroud)

测试班

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());
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*lak 3

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

https://github.com/mockito/mockito/issues/168

我在版本 1.9.5 和最新的 1.10.19 中遇到相同的(损坏的)行为。

我建议您使用 Mockito 提出该错误。

作为临时解决方法,有以下几种选择:

  • 使班级公开
  • public void callOnce() { super.callOnce(); }在子类中添加