[英]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 : 所以我们有两个选择:
ProcessBuilder
with a default implementation... in the same way we create the ProcessBuilderFactory
ProcessBuilder
...与创建ProcessBuilderFactory
方式相同 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.