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

时间:2016-08-04 10:33:17

标签: java unit-testing inheritance mockito

我遇到问题,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

1 个答案:

答案 0 :(得分:1)

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

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

我在版本1.9.5和最近的1.10.19中获得相同(损坏)的行为。

我建议你用Mockito提出错误。

作为临时解决方案,有几个选择:

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