有没有办法在Java中模拟单元测试的静态方法而不执行方法的实际实现?实际实现启动了在单元测试上下文中无法完成的过程。
public class MyExecutor {
public static int execute(...) {
Process pr = Runtime.getRuntime().exec(...)
int status = pr.waitFor();
return status;
}
public MyClass {
public void methodToUnitTest(...){
MyExecutor.execute(...)
}
当单元测试MyClass.methodToUnitTest时,我想模拟MyExecutor.execute并验证它的调用和参数,但没有实际执行这个方法。
我读到PowerMockito可以模拟静态方法,但它不会阻止实际实现的执行。
将静态类MyExecutor
封装在非静态类中。将新的非静态类的方法提取到接口中。用接口替换静态类的依赖项-使用依赖项注入为MyClass
:提供MyExecutor
实例
public MyExecutorAdapter implements Executor{
public void execute() {
MyExecutor.execute() //call to static code
}
}
public MyClass {
private Executor myExecutor;
public MyClass(Executor myExecutor){ //MyExecutorAdapter instance can be injected here
this.myExecutor = myExecutor;
}
public void methodToUnitTest(...){
myExecutor.execute(...)
}
}
现在,使用该接口,您可以轻松地模拟或提供用于测试目的的伪实现。在您的情况下,您可能需要一个mock来检查是否调用了execute
方法。
这基本上被称为Adapter pattern