我有一个家长班家长
class Parent{
public String calculate(String input){
// does lots of external system calls and complex calculations
}
}
然后我有一个抽象类,它扩展了父母。
public abstract class AbsChild extends Parent{
public String calculatePayments(String abc, String xyz){
String ZXC = doSomething(abc);
// more code
}
private String doSomething(String abc){
String STR = super.calculate(abc);
// more code
}
}
现在我需要为这个calculatePayments 方法编写一个测试用例。我嘲笑了 super.calculate(abc) 但它仍然调用真正的方法并抛出异常。 这是我尝试过的。
public class AbsChildTest extends AbsChild{
@Test
public void testCalculatePayments(){
Parent parent = mock(Parent.class);
when(parent.calculate(anyString())).thenReturn("str");
this.calculatePayments("abc", "xyz");
}
}
这总是调用真正的方法,该方法调用了许多外部系统。不使用PowerMock可以实现吗?
这不起作用,因为代码中的“this”对象会转换为 JVM 代表“this”调用超级方法calculate()。并且“this”是一个“真实对象”,而不是一个模拟对象。您需要以某种方式将模拟注入执行中。下面是一个使用包装器作为被测系统的示例:
public class AbsChildTest {
// System Under Test (sut)
private class AbsChildWrapper extends AbsChild {
// provide methods and constructors from AbsChild required to be overidden
}
@Test
public void testCalculatePayments(){
AbsChildWrapper sut = Mockito.spy(new AbsChildWrapper());
Mockito.when(sut.calculate(ArgumentMatchers.anyString())).thenReturn("str");
String result = sut.calculatePayments("abc", "xyz");
Assertions.assertEquals("str", result);
}
}