我扩展了一个方法并尝试测试子方法,但是有一个对重写方法的调用,我不知道如何模拟。
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
您不要将
mock()
与正在测试的代码一起使用,而是将 spy()
与具体实例一起使用:
子切 = Mockito.spy(new Child());
但这不适用于Child
类中重写的方法,因为
spy()
只是包装剪切并使用常规多态性拦截方法调用。 不要模拟或监视您的测试代码
,并且由于 Child
扩展了
Parent
我认为它们都是一个“单元”。在这种情况下,super.foo()
的调用是一个实现细节,您不应该被测试。
Child
和
Parent
是单独的单元,您还应该考虑应用优先组合而不是继承,并将实例 ob
Parent
注入 Child
(最好通过 构造函数参数),而不是使用
Child
延伸Parent
。这使得用测试替身替换 Parent
变得更容易。
callSuperFoo
。然后我可以用 Mockito 模拟这个方法。