[英]Java - Unit Test
在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和...)的常用命令,或者我可以在單元測試中傳遞給此方法的假命令。
有什么建議嗎?
此方法無法通過單元測試進行測試,只能通過集成測試進行測試。 要進行單元測試,你可以做一個小型的重構。 引入一個新的接口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...");
}
}
}
然后你可以通過注入一個模擬ProcessBuilderFactory
來進行單元測試。 你開始編寫測試,你創建一個模擬ProcessBuilderFactory
,返回一個模擬ProcessBuilder
...該死的, ProcessBuilder
也是final
:(
強烈提醒:先寫測試!
所以我們有兩個選擇:
ProcessBuilder
...與創建ProcessBuilderFactory
方式相同 由於這是java單元測試,您可以使用java.exe作為標准exe。 說java.exe -version
。 它將永遠在那里:)。 使用java.home中的當前jdk,然后使用它來引用java.exe
查看具體要求可以使用任何模擬框架嗎? (例如jmockit )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.