【问题标题】:Mockito calls real method from superclass when stubbingMockito 在存根时从超类调用真实方法
【发布时间】: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 方法抛出的示例。

【问题讨论】:

标签: java unit-testing inheritance mockito


【解决方案1】:

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

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

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

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

作为临时解决方法,有几个选项:

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

【讨论】:

  • 感谢您的信息。看起来它处于 2.0 里程碑。这两个类都来自外部组件,但我刚刚创建了另一个覆盖此方法的子类。
猜你喜欢
  • 2015-08-18
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多