如何在不同包中测试 child 中的 public 方法时从抽象 parent 模拟或存根受保护的方法

How to Mock or Stub a protected method from abstract parent while testing a public method in child with both in different packages

我有无法更改的遗留代码,但我需要用 JUnit 测试来覆盖。我一直在尝试各种 Mockito 和 PowerMockito 的用法,但都无济于事。

摘要Parent

package com.parent;

public abstract class Parent {

    public Parent() {
    }

    protected void badMethod() {
        //code
    }

    // public methods

}

Public Child

package com.child;

public class Child extends Parent {

    public void methodToTest() {
        //code

        badMethod();

        //code
    }
}

我需要测试的代码出现在调用 badMethod() 之后。有没有办法存根、模拟或绕过 badMethod() 调用? child class.

中没有 badMethod() 的 @Override

badMethod() 调用尝试建立数据库连接,并调用其他服务。我实际测试的代码不需要这些。

您可以在测试中扩展 class Child 并在新的 class 中扩展 "disable" badMethod

public class YourTest {

    @Test
    public void testSomething() {
        Child child = new ChildWithDisabledBadMethod();

        child.methodToTest();

        //put your assertions here
    }

    private static class ChildWithDisabledBadMethod extends Child {
        protected void badMethod() {
        }
    }
}