出于代码覆盖目的,通过被测 public 方法模拟特定的私有方法调用

Mocking a particular private method call by a public method under test for code coverage purposes

这是一个例子class。

public class Example {

    private String method1() {
        return "Hello";
    }

    private String method2() {
        //Makes an external API call which I can't make
        return "World";
    }

    public String methodBeingTested() {

        String m1 = method1();
        String m2 = method2();
        return m2
    }
}

我的意图是为了代码覆盖目的单元测试通过 method1(),但不通过 method2() 因为它不能被调用!

这是我试过的方法:

  1. 创建 Example class 的 Mock 并执行 .when(exampleMock.methodBeingTested()).thenReturn(createdString) 但这根本不会调用(由代码覆盖率显示)

  2. 不是创建 Mock,而是传递一个实际实例,.when(actualExampleInstance.methodBeingTested()).thenReturn(createdString) 在这种情况下函数 method2() 确实被调用并抛出错误,因为我实际上仍然不能调用外部 API 但代码需要存在..

这样的实现是不可能的 - 你可以做的是重构代码并将 method1method2 移动到一些外部 类,注入它们并模拟第二个在测试中

// Such interfaces you can implement package-private due to visibility purposes
public interface Processor1 {
    String method1(); 
}

public interface Processor2 {
    String method2(); 
}

public class Example {
    private Processor1 p1;
    private Processor2 p2;

    public String methodBeingTested() {
        String m1 = p1.method1();
        String m2 = p2.method2();
        return m2
    }
}

您可以模拟用于进行 API 调用的对象。

检查这个 post how to mock a URL connection