我扩展了一个方法,并尝试测试子方法,但是调用了重写方法,我无法弄清楚如何模拟。
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
答案 0 :(得分:1)
您不会对正在测试的代码使用mock()
,而是将spy()
与具体实例一起使用:
Child cut = Mockito.spy(new Child());
但是对于在Child
类中重写的方法,不会工作,因为spy()
只是包装剪切并使用常规多态性拦截方法调用
UnitTest验证单元的公共可观察行为,并且Child
延伸Parent
我认为它们是一个“单位”。在这种情况下,super.foo()
的调用是实现细节,您不应该对其进行测试。
如果您认为Child
和Parent
是单独的单位,您还应考虑应用偏好合成而不是继承并注入实例ob Parent
进入Child
(最好是通过构造函数参数)而不是Child
扩展Parent
。这样可以更轻松地将Parent
替换为测试双。