Java中的模拟静态方法



有没有办法在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

最新更新