java - 如何模拟 super 方法调用

标签 java unit-testing mocking mockito

我扩展了一个方法并尝试测试子方法,但有一个对重写方法的调用,我不知道如何模拟。

public class Parent()
{
    public String foo()
    {
        //Various checks and validation

        if(successful)
        {
            return null;
        }
        else
        {
            return "error";
        }
    }
}

public class Child()
{
    boolean someVariableSetElseWhere;

    @Override
    public String foo()
    {
        String error = super.foo();

        if(error == null && someVariableSetElseWhere)
        {
            //do some other checks
            error = bar();
        }

        return error;
    }
}

我想检查当 someVariableSetElseWhere 处于不同状态时是否调用 bar(),但我总是收到 "error"来自 super.foo(),因此 if 语句始终为 false。有没有办法模拟父类(super class)返回 null。

我试过了

Child mock = Mockito.mock(Child.class);
Mockito.when((Parent)mock.foo()).thenReturn(null);

在我的测试中,但 Child.foo() 每次都返回 null

最佳答案

您不要将 mock() 与正在测试的代码一起使用,而是将 spy() 与具体实例一起使用:

子切 = Mockito.spy(new Child());

但这对于 Child 类中重写的方法不起作用,因为 spy() 只是包装剪切并拦截方法调用使用常规的多态性。

不要模拟或监视您的测试代码

  1. UnitTest 验证单元的公共(public)可观察行为,并且由于 Child 扩展 Parent 我认为它们是一个“单元” “全部一起。在这种情况下,super.foo() 的调用是一个实现细节,您不应该对其进行测试。

  2. 如果您认为 ChildParent 是单独的单元,您还应该考虑应用优先组合而不是继承并注入(inject)一个实例将 Parent 转换为 Child(最好通过构造函数参数),而不是让 Child 扩展 Parent >。这使得用测试替身替换 Parent 变得更加容易。

关于java - 如何模拟 super 方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48631244/

相关文章:

java - 重启后如何使值永久化

java - 为引用的实例赋值

java - Apache tomcat maven 插件在不存在的 Java 版本上编译

c# - 重置 Azure 开发存储

unit-testing - 使用 Mockoon 和 Nunit 模拟 API 调用进行单元测试

java - 命令解释器出现问题

unit-testing - 写完代码再做单元测试没用吗?

java - 使用 @PostConstruct 模拟类会导致初始化失败

ruby-on-rails - 在 Rails 中测试辅助方法

reactjs - 无法使用 Jest 模拟 react 原生声音