Java 使用Mockito(v1.9.5)存根超类方法的调用

Java 使用Mockito(v1.9.5)存根超类方法的调用,java,unit-testing,mockito,Java,Unit Testing,Mockito,我试图测试一个方法,根据某些条件,该方法将执行其代码或其超类的代码。 下面是类及其父类的代码: public class ParentClass { public Object doStuff(Parameters parameters) { // do some business stuff return parentResult; } } 继承的类的一个: public class InheritedClass extends ParentClass { @Overri

我试图测试一个方法,根据某些条件,该方法将执行其代码或其超类的代码。 下面是类及其父类的代码:

public class ParentClass {

public Object doStuff(Parameters parameters) {
    // do some business stuff
    return parentResult;
}
}
继承的类的一个:

public class InheritedClass extends ParentClass {

@Override
public Object doStuff(Parameters parameters) {
    if (parameters.getCondition()) {
        return super.doStuff(parameters);
    }
    //do some business stuff
    return inheritedResult;
}
}
因此,当尝试测试parameters.getCondition()为true时,我必须模拟对super方法的调用并验证它

但当我这样做时(模拟对super.doStuff()的调用),我也会模拟对InheritedClass.doStuff()的调用。 以下是我尝试过的解决方案:

@RunWith(MockitoJUnitRunner.class)
public class InheritedClassTest {
@Mock
private Parameters parameters;

@Spy
private InheritedClass inherited = new InheritedClass();

@Test
public void testDoStuff(Object parameters) throws Exception {
    given(parameters.getCondition()).willReturn(true);
    doCallRealMethod().doReturn(value).when(inherited).doStuff(parameters);

    Mockito.verify(inherited, times(2)).doStuff(parameters);
}
}
我也试过这样做:

when(inherited.doStuff(parameters)).thenCallRealMethod().thenReturn(value);
还有这个:

given(((ParentClass)inherited).doStuff(parameters)).willReturn(value);
在所有这些情况下,父类的代码都被真正执行了。 因此,我想知道是否有任何有效的方法可以使用mockito模拟超类方法的调用?

您可以使用mockito的spy(),这是您已经尝试过的。但是我认为使用spy()的另一种方式会使它工作

ParentClass.java

public class ParentClass {
    public String doStuff(final String parameters) {
        return "parent";
    }
}
public class InheritedClass extends ParentClass {
    @Override
    public String doStuff(final String parameters) {
        if (parameters.equals("do parent")) {
            return super.doStuff(parameters);
        }
        return "child";
    }
}
InheritedClass.java

public class ParentClass {
    public String doStuff(final String parameters) {
        return "parent";
    }
}
public class InheritedClass extends ParentClass {
    @Override
    public String doStuff(final String parameters) {
        if (parameters.equals("do parent")) {
            return super.doStuff(parameters);
        }
        return "child";
    }
}
InheritedClassTest.java

public class InheritedClassTest {
    @Test
    public void testDoStuff() throws Exception {
        final InheritedClass inheritedClass = Mockito.spy(new InheritedClass());

        Mockito.doReturn("mocked parent").when((ParentClass)inheritedClass).doStuff(Mockito.eq("do parent"));

        final String result = inheritedClass.doStuff("do parent");

        assertEquals("mocked parent", result);
        assertNotEquals("parent", result);

        final String resultChild = inheritedClass.doStuff("aaa");

        assertEquals("child", resultChild);
    }
}
但是,我不认为使用spy()是一种好的做法。我会亲自重构您的代码。

您可以使用Mockito的spy(),这是您已经尝试过的。但是我认为使用spy()的另一种方式会使它工作

ParentClass.java

public class ParentClass {
    public String doStuff(final String parameters) {
        return "parent";
    }
}
public class InheritedClass extends ParentClass {
    @Override
    public String doStuff(final String parameters) {
        if (parameters.equals("do parent")) {
            return super.doStuff(parameters);
        }
        return "child";
    }
}
InheritedClass.java

public class ParentClass {
    public String doStuff(final String parameters) {
        return "parent";
    }
}
public class InheritedClass extends ParentClass {
    @Override
    public String doStuff(final String parameters) {
        if (parameters.equals("do parent")) {
            return super.doStuff(parameters);
        }
        return "child";
    }
}
InheritedClassTest.java

public class InheritedClassTest {
    @Test
    public void testDoStuff() throws Exception {
        final InheritedClass inheritedClass = Mockito.spy(new InheritedClass());

        Mockito.doReturn("mocked parent").when((ParentClass)inheritedClass).doStuff(Mockito.eq("do parent"));

        final String result = inheritedClass.doStuff("do parent");

        assertEquals("mocked parent", result);
        assertNotEquals("parent", result);

        final String resultChild = inheritedClass.doStuff("aaa");

        assertEquals("child", resultChild);
    }
}
但是,我不认为使用spy()是一种好的做法。我会亲自重构您的代码。