给定 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
...该死的,ProcessBuilder
是 final
:(
强烈提醒:先写测试!
所以我们有两个选择:
- 引入一个新接口(interface),用于使用默认实现包装
ProcessBuilder
...与我们创建ProcessBuilderFactory
的方式相同 - 撤消重构并查看PowerMock , 用于最后一节课的模拟
关于Java - 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138065/