我正在测试使用继承方法的遗留代码。我试图模仿超级方法 验证超级方法是否正在被呼叫。
@RunWith(PowerMockRunner.class)
public class HumanTest {
@Test
public void test() throws NoSuchMethodException, SecurityException {
// 1. arrange
Human sut = PowerMockito.spy(new Human());
PowerMockito.doNothing().when((SuperHuman) sut).run(); // SuperHuman is the parent class
// 2. action
sut.run();
// 3. assert / verify
}
}
public class Human extends SuperHuman {
@Override
public void run() {
System.out.println("human run");
super.run();
}
}
public class SuperHuman {
public void run() {
System.out.println("superhuman run");
}
}
我在期待"人类跑步"将被打印。但实际结果没有印刷。
答案 0 :(得分:0)
PowerMockito.doNothing().when((SuperHuman) sut).run(); // SuperHuman is the parent class
这对你的情况不起作用,因为即使你做了演员,PowerMockito也会模拟人类的方法。 我检查了你的代码示例,并且可以说可以使用:
来抑制超类方法的调用Method toReplace = PowerMockito.method(SuperHuman.class, "run");
PowerMockito.suppress(toReplace);
但似乎方法替换功能不适用于超类的方法: createPartialMock should support mocking overridden methods in super classes.
所以这不起作用:
PowerMockito.replace(toReplace).with(new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Method of superclass has been invoked !");
return null;
}
});
但是你应该能够通过模拟仅在super方法中调用的其他类来间接地验证super方法的调用。 例如,检查是否使用“superhuman run”或类似的东西调用了System.out.println。