出于代码覆盖目的,通过被测 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()
因为它不能被调用!
这是我试过的方法:
创建 Example
class 的 Mock 并执行 .when(exampleMock.methodBeingTested()).thenReturn(createdString)
但这根本不会调用(由代码覆盖率显示)
不是创建 Mock,而是传递一个实际实例,.when(actualExampleInstance.methodBeingTested()).thenReturn(createdString)
在这种情况下函数 method2()
确实被调用并抛出错误,因为我实际上仍然不能调用外部 API 但代码需要存在..
这样的实现是不可能的 - 你可以做的是重构代码并将 method1
和 method2
移动到一些外部 类,注入它们并模拟第二个在测试中
// 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
这是一个例子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()
因为它不能被调用!
这是我试过的方法:
创建
Example
class 的 Mock 并执行.when(exampleMock.methodBeingTested()).thenReturn(createdString)
但这根本不会调用(由代码覆盖率显示)不是创建 Mock,而是传递一个实际实例,
.when(actualExampleInstance.methodBeingTested()).thenReturn(createdString)
在这种情况下函数method2()
确实被调用并抛出错误,因为我实际上仍然不能调用外部 API 但代码需要存在..
这样的实现是不可能的 - 你可以做的是重构代码并将 method1
和 method2
移动到一些外部 类,注入它们并模拟第二个在测试中
// 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