如何模拟超级方法调用

时间:2018-02-05 20:50:20

标签: 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;
    }
}

我想检查当bar()处于不同状态时是否调用someVariableSetElseWhere,但我总是从"error"获取super.foo(),所以if语句总是假的。有没有办法模拟超类返回null。

我试过

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

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

1 个答案:

答案 0 :(得分:1)

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

Child cut = Mockito.spy(new Child());

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

不要模拟或监视您的代码

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

  2. 如果您认为ChildParent是单独的单位,您还应考虑应用偏好合成而不是继承并注入实例ob Parent进入Child(最好是通过构造函数参数)而不是Child扩展Parent。这样可以更轻松地将Parent替换为测试双。