繁体   English   中英

模拟 Java 中的静态方法

[英]Mocking static method in 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(...)

    }

我想模拟 MyExecutor.execute 并在单元测试 MyClass.methodToUnitTest 但没有实际执行此方法时验证其调用及其参数。

我读到 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(...)
  }
}

现在,使用该接口,您可以轻松模拟或提供用于测试目的的虚假实现。 在您的情况下,您可能需要有一个模拟来检查是否调用了execute方法。

这基本上被称为Adapter pattern

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM