Java - 单元测试

标签 java unit-testing junit

给定 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 和...)的通用命令,或者我可以在我的单元测试中传递给此方法的虚假命令。

有什么建议吗?

最佳答案

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

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...");
        }
    }
}

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

强烈提醒:先写测试!

所以我们有两个选择:

  1. 引入一个新接口(interface),用于使用默认实现包装 ProcessBuilder...与我们创建 ProcessBuilderFactory 的方式相同
  2. 撤消重构并查看PowerMock , 用于最后一节课的模拟

关于Java - 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138065/

相关文章:

java - 字符串是子字符串的组合吗?

java - XML 签名验证失败

java - JUnit 断言失败

java - 如何在 Mockito 中模拟方法参数

android - 如果发生 HttpException,Retrofit 和 RxJava 的单元测试永远不会完成

java - 无法执行 Junit 参数化测试执行

java - 从 PhoneGap 访问 Urban Airship Constant

Java "error: illegal start of type"抛出 IllegalArgumentException 时

c# - FluentAssertions 检查对象字段是否不相等?

java - 即使 sql 查询不应返回任何记录,JUnit 测试仍然通过