我扩展了一个方法并尝试测试子方法,但有一个对重写方法的调用,我不知道如何模拟。
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()
只是包装剪切并拦截方法调用使用常规的多态性。
不要模拟或监视您的测试代码
UnitTest 验证单元的公共(public)可观察行为,并且由于
Child
扩展Parent
我认为它们是一个“单元” “全部一起。在这种情况下,super.foo()
的调用是一个实现细节,您不应该对其进行测试。如果您认为
Child
和Parent
是单独的单元,您还应该考虑应用优先组合而不是继承并注入(inject)一个实例将Parent
转换为Child
(最好通过构造函数参数),而不是让Child
扩展Parent
>。这使得用测试替身替换Parent
变得更加容易。
关于java - 如何模拟 super 方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48631244/