当前位置: 首页 > 知识库问答 >
问题:

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

景昊焜
2023-03-14

我有以下代码

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

鲁乐
2023-03-14
  1. 不可以。只能通过反射来访问私有变量。这通常不是首选,尤其是在单元测试中
  2. 是的,假设您对超类方法调用做了一些可断言的更改。就像布尔标志的变化一样
  3. 是的,你可以使用powermockito。更多信息请参见此处。使用mockito测试私有方法
穆旭尧
2023-03-14

在进行单元测试时,我们验证被测试代码的公共可观察行为。这是CUT传递的返回值及其与依赖项的通信。

CUT中的私有变量和私有方法是我们不想(明确地)测试的实现细节,因为我们希望它们是可更改的,而不会阻止我们的测试。

在极少数情况下,对超类方法的调用可以被视为“与依赖项的通信”。在这种情况下,您将创建切割的spy()。但通常这也应该被视为实施细节。。。

江新
2023-03-14

如果您真的想验证它,您需要更改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);
    }
}

希望这有帮助。

 类似资料: