我正在尝试测试一种方法,根据某些条件,它将执行其代码或其超类的代码。 以下是该类及其父级的代码:
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;
}
}
所以,当在参数.getCondition()为true时尝试测试时,我必须在super方法上模拟调用并验证它。
但是当我这样做(模拟对super.doStuff()的调用)时,我也模拟了对InhertitedClass.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调用超类方法?
答案 0 :(得分:0)
您可以使用已经尝试过的Mockito谍照()。但我认为使用spy()的另一种方法是使其有效。
ParentClass.java
public class ParentClass {
public String doStuff(final String parameters) {
return "parent";
}
}
InheritedClass.java
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()不是一个好习惯。我个人会重构你的代码。