Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟超级方法调用_Java_Unit Testing_Mocking_Mockito - Fatal编程技术网

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
的结果。我同意你的其他建议。