如何使用Mockito使用私有方法调用来测试void方法

时间:2017-06-14 07:06:52

标签: java unit-testing mocking mockito powermockito

我有以下代码

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
 }
}

我是嘲笑的新手。我有疑虑。我正在尝试测试公共方法。

  1. 我可以断言私有变量workDone的值吗?
  2. 是否可以验证超类中的方法调用?
  3. 如何在方法中模拟私有方法调用?

3 个答案:

答案 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)

  1. 否。除了通过反射之外,不能访问私有变量。这通常不是首选,特别是在单元测试中。
  2. 是的,假设您对超类方法调用进行了一些可断言的更改。就像boolean flag
  3. 中的变化一样
  4. 是的,你可以使用powermockito。有关详情,请参阅此处 Testing Private method using mockito