我有以下代码
public class A extends B {
private boolean workDone = false;
@Override
public void publicMethod(boolean flag) {
if (!workDone) {
privateMethod();
workDone = true;
}
super.publicMethod(flag);
}
private void privateMethod() {
// some logic here
}
}
我是嘲笑的新手。我有疑虑。我正在尝试测试公共方法。
答案 0 :(得分:2)
如果你真的想验证它,你需要更改你的A类并将超级调用解压缩为私有方法:
public class A extends B {
private boolean workDone = false;
@Override
public void publicMethod(final boolean flag) {
if (!workDone) {
privateMethod();
workDone = true;
}
callParentPublicMethod(flag);
}
private void callParentPublicMethod(final boolean flag) {
super.publicMethod(flag);
}
private void privateMethod() {
System.out.println("A: privateMethodCalled");
}
}
完成此操作后,您可以使用PowerMock验证私有方法调用:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ A.class })
public class ATest {
@Test
public void publicMethod_test_false() throws Exception {
A spy = PowerMockito.spy(new A());
spy.publicMethod(false);
PowerMockito.verifyPrivate(spy).invoke("privateMethod");
PowerMockito.verifyPrivate(spy).invoke("callParentPublicMethod", false);
}
@Test
public void publicMethod_test_true() throws Exception {
A spy = PowerMockito.spy(new A());
spy.publicMethod(true);
PowerMockito.verifyPrivate(spy).invoke("privateMethod");
PowerMockito.verifyPrivate(spy).invoke("callParentPublicMethod", true);
}
}
希望这有帮助。
答案 1 :(得分:0)
在进行单元测试时,我们会验证代码下的公众可观察行为。这是CUT及其与依赖关系的通信提供的返回值。
CUT中的私有变量和私有方法是实现细节我们不想(明确地)进行测试,因为我们希望它们可以在不制动测试的情况下进行更改。
在极少数情况下,对超类方法的调用可被视为"与依赖关系的通信"。在这种情况下,您创建一个CUT的spy()
。但通常这应该被视为实现细节 ......
答案 2 :(得分:0)
boolean flag