5

给定 Java 类中的此方法:

public void execute(String command) {

    ProcessBuilder processBuilder = new ProcessBuilder(command);
    Process process = processBuilder.start();

    int exitValue = process.waitFor();
    if (exitValue != 0) {
        throw new RuntimeException("a message here...");
    }
}

我正在尝试为此方法提出适当的跨平台单元测试。

我正在寻找跨所有操作系统(Win、Linux、Mac 和...)的通用命令,或者我可以在单元测试中传递给此方法的虚假命令。

有什么建议吗?

4

2 回答 2

8

此方法无法通过单元测试进行测试,而只能通过集成测试进行测试。要进行单元测试,您可以进行一个小的重构。引入一个新接口ProcessBuilderFactory(和一个默认实现)并将其注入您的类。

public interface ProcessBuilderFactory {
    ProcessBuilder createProcessBuilder(String command);
}

public class DefaultProcessBuilderFactory implements ProcessBuilderFactory {
    public ProcessBuilder createProcessBuilder(String command) {
        return new ProcessBuilder(command);
    }
}

public class ProcessExecutor {
    private ProcessBuilderFactory processBuilderFactory;
    private ProcessExecutor(ProcessBuilderFactory processBuilderFactory) {
        this.processBuilderFactory = processBuilderFactory;
    }

    public void execute(String command) {
        ProcessBuilder processBuilder = processBuilderFactory.createProcessBuilder(command);
        Process process = processBuilder.start();

        int exitValue = process.waitFor();
        if (exitValue != 0) {
            throw new RuntimeException("a message here...");
        }
    }
}

然后你可以通过注入一个 mock来进行单元ProcessBuilderFactory测试。您开始编写测试,创建一个 mock ProcessBuilderFactory,返回一个 mock ProcessBuilder...该死的,ProcessBuilderfinal:(

强烈提醒:先写测试!

所以我们有两个选择:

  1. 引入一个新的接口来包装ProcessBuilder一个默认实现......以同样的方式我们创建ProcessBuilderFactory
  2. 撤消重构并查看PowerMock,以进行最终类模拟
于 2012-08-27T08:12:18.190 回答
2

由于这是 java 单元测试,您可以使用 java.exe 作为标准 exe。说java.exe -version。它会一直在那里:)。使用 java.home 中的当前 jdk,然后使用它来引用 java.exe

查看特定要求,您可以使用任何模拟框架吗?(例如jmockit )

于 2012-08-27T08:12:32.720 回答