如何模拟超级方法调用

问题描述 投票:0回答:2

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

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

java unit-testing mocking mockito
2个回答
3
投票

您不要将

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

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

但这不适用于Child类中重写的方法,因为

spy()
只是包装剪切并使用常规
多态性
拦截方法调用。 不要模拟或监视您的测试代码

    UnitTest 验证一个单元的
  1. 公共可观察行为

    ,并且由于 Child 扩展了

    Parent
    我认为它们都是一个“单元”。在这种情况下,
    super.foo()
    的调用是一个
    实现细节
    ,您不应该被测试。

  2. 如果您认为
  3. Child

    Parent
    是单独的单元,您还应该考虑应用
    优先组合而不是继承
    ,并将实例 ob Parent 注入
    Child
    (最好通过
    构造函数参数
    ),而不是使用Child延伸
    Parent
    。这使得用测试替身替换
    Parent
    变得更容易。
    
    


0
投票
callSuperFoo

。然后我可以用 Mockito 模拟这个方法。

    

© www.soinside.com 2019 - 2024. All rights reserved.