简体   繁体   English

Java - 单元测试

[英]Java - Unit Test

Given this method in a Java class: 在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...");
    }
}

I'm trying to come up with a proper cross platform unit test for this method. 我正在尝试为这种方法提出适当的跨平台单元测试。

I'm looking for a common command across all operating systems (Win, Linux, Mac and ...) or a fake command that I can pass to this method in my unit tests. 我正在寻找所有操作系统(Win,Linux,Mac和...)的常用命令,或者我可以在单元测试中传递给此方法的假命令。

Any suggestion ? 有什么建议吗?

This method can't be tested via a unit test but only via an integration test. 此方法无法通过单元测试进行测试,只能通过集成测试进行测试。 To make a unit test you could do a small refactor. 要进行单元测试,你可以做一个小型的重构。 Introduce a new interface ProcessBuilderFactory (and a default implementation) and inject it on your class. 引入一个新的接口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...");
        }
    }
}

and then you could make a unit test by injecting a mock ProcessBuilderFactory . 然后你可以通过注入一个模拟ProcessBuilderFactory来进行单元测试。 You start writing the test, you create a mock ProcessBuilderFactory , returning a mock ProcessBuilder ... damned, ProcessBuilder is final too :( 你开始编写测试,你创建一个模拟ProcessBuilderFactory ,返回一个模拟ProcessBuilder ...该死的, ProcessBuilder也是final :(

A strong reminder : write the test first ! 强烈提醒:先写测试!

So we have two options : 所以我们有两个选择:

  1. introduce a new interface for wrapping the ProcessBuilder with a default implementation... in the same way we create the ProcessBuilderFactory 引入一个新的接口,用于使用默认实现包装ProcessBuilder ...与创建ProcessBuilderFactory方式相同
  2. undo the refactoring and look at PowerMock , for final class mocking 撤消重构并查看PowerMock ,以进行最终的类模拟

Since this is java unit test you could use java.exe as standard exe. 由于这是java单元测试,您可以使用java.exe作为标准exe。 Say java.exe -version . java.exe -version It will always be there :). 它将永远在那里:)。 Use current jdk from java.home and then use that to refer java.exe 使用java.home中的当前jdk,然后使用它来引用java.exe

Looking at specific requirement could you use any mocking framework? 查看具体要求可以使用任何模拟框架吗? ( jmockit for example) (例如jmockit

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

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