【问题标题】:How to test void method with private method calls using Mockito如何使用 Mockito 使用私有方法调用测试 void 方法
【发布时间】:2017-06-14 07:06:51
【问题描述】:

我有以下代码

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. 如何在方法中模拟私有方法调用?

【问题讨论】:

    标签: java unit-testing mocking mockito powermockito


    【解决方案1】:

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

    希望这会有所帮助。

    【讨论】:

    • 对不起,代码有错误,我刚刚更新了。要测试的方法中的if条件取决于私有变量。
    【解决方案2】:

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

    CUT 中的私有变量和私有方法是实现细节我们不想(明确地)测试,因为我们希望它们可以在不中断测试的情况下进行更改。

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

    【讨论】:

      【解决方案3】:
      1. 没有。私有变量只能通过反射访问。这通常不是首选,尤其是在单元测试中。
      2. 是的,假设您对超类方法调用进行了一些可断言的更改。喜欢boolean flag的变化
      3. 是的,您可以使用 powermockito。有关更多信息,请参见此处。 Testing Private method using mockito

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多