Java 如何模拟超级方法调用
我扩展了一个方法并尝试测试子方法,但是有一个对重写方法的调用,我不知道如何进行模拟Java 如何模拟超级方法调用,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我扩展了一个方法并尝试测试子方法,但是有一个对重写方法的调用,我不知道如何进行模拟 public class Parent() { public String foo() { //Various checks and validation if(successful) { return null; } else { return "er
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;
}
}
我想检查当SomeVariableSetOthere
处于不同状态时是否调用bar()
,但是我总是从super.foo()
中得到“error”
,因此if语句总是false。有没有办法模仿超类返回null
我试过了
Child mock = Mockito.mock(Child.class);
Mockito.when((Parent)mock.foo()).thenReturn(null);
在我的测试中,但Child.foo()每次返回null时,如果不在测试代码中使用mock()
,则在具体的instace中使用spy()
:
Child cut=Mockito.spy(new Child())
但是这对于在子类中重写的方法将不起作用,因为spy()
只是简单地包装剪切并使用常规多态性拦截方法调用
不要模仿或刺探测试中的代码
>UnTest-Unter验证一个单元的公开可观察行为,并且由于子< /C> >扩展< <代码>父/代码>,我会认为它们是一个“单元”。在这种情况下,super.foo()
的调用是一个不应该测试的实现细节
<> > > > P> >如果考虑<代码>子< /代码>和<代码>父< /代码>为单个单元,则还应考虑将赞成成分应用于继承,并将实例OB<代码>父< /代码>注入<代码>子< /代码>(最好通过构造函数参数)而不是< <代码>子< /代码>扩展<代码>父< /代码>。这使得用双精度测试替换父项更加容易
您的示例应该清楚地表明,Child扩展了Parent
,这可能有助于更正类定义的语法。此外,模仿超级电话是个坏主意。如果重写方法的结果应该依赖于super,则以集成的方式对其进行测试(否则测试的是模拟,而不是代码)。如果重写方法的结果不应依赖于super,则不要调用super并从super方法复制代码。在这两种情况下,您都不需要模拟。使用spy
将无法测试超级调用when(cut.foo())
不会更改Parent.foo
的结果,而是更改Child.foo
的结果。我同意你的其他建议。