gpt4 book ai didi

mockito - 如何使用 PowerMockito 验证调用了 super 方法

转载 作者:行者123 更新时间:2023-12-05 07:57:31 25 4
gpt4 key购买 nike

我正在测试使用继承方法的遗留代码。我正在尝试模拟 super 方法验证 super 方法是否被调用。

@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");
}
}

我原以为会打印“human run”。但实际结果是没有打印出来。

最佳答案

PowerMockito.doNothing().when((SuperHuman) sut).run(); // SuperHuman is the parent class

这在您的情况下不起作用,因为即使您进行了转换,PowerMockito 也会模拟 Human 的方法。我检查了您的代码示例,可以说可以通过以下方式抑制父类(super class)方法的调用:

Method toReplace = PowerMockito.method(SuperHuman.class, "run");
PowerMockito.suppress(toReplace);

但似乎方法替换功能不适用于父类(super class)的方法: 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 方法的调用。例如,检查 System.out.println 是否被“superhuman run”或类似的东西调用。

关于mockito - 如何使用 PowerMockito 验证调用了 super 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26921367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com