我的进程只是将一些内容添加到系统变量PATH
中。实际上,我正在使用使用 setx.exe
的 Process
来执行此操作:
public void changePath(String newPath ) {
String path = System.getenv("PATH") + ";";
String[] cmd = new String[]{"C:\\Windows\\System32\\setx.exe", "PATH",
path+newPath, "-m"};
ProcessBuilder builder = new ProcessBuilder(cmd);
...
}
所以我尝试为其编写一个测试用例。
Class UpdatePathTest {
@Test
public void testUpdatePath() {
//call the method that update the path
changePath("C:\\somebin");
assertTrue(System.getenv("PATH").contains("C:\\somebin")); //fails
// ProcessBuilder with command String[]{"cmd", "/C", "echo", "%PATH%"}; will fail too.
//and the above in a new Thread will fail too.
}
}
那么,有没有办法获取新的PATH值呢?编写新路径是唯一的选择,因为我正在开发一个将安装桌面应用程序的 jar。
最佳答案
我不确定在单元测试中更改路径是个好主意。如果测试失败怎么办?您必须确保完成所有相关的整理工作。
考虑反转依赖项并使用依赖项注入(inject)。
This我认为文章解释得很好。
所以不要有一个方法:
public void method() {
String path = System.getenv("PATH") + ";";
//do stuff on path
}
考虑这样做:
public void method(String path) {
//do stuff on path
}
它允许您 stub 路径。如果您无法更改方法的签名,请考虑使用工厂模式并使用测试工厂来获取路径。
编辑:更新问题后
这里您必须考虑的是您正在测试的内容。当您调用 C:\Windows\System32\setx.exe 时,您已阅读 API 文档并使用正确的参数调用它。这很像调用 java API 上的另一个方法。例如,如果您正在操作一个列表,您“知道”它是从零开始的。您不需要对此进行测试,只需阅读 API,社区就会支持您。为了测试changePath,我认为您可能要测试ProcessBuilder 中的内容。您再次阅读了 API 文档,并且必须假设您传递了正确的变量。 (请参阅底部的//1)并且您必须再次假设 ProcessBuilder 工作正常并且 Oracle(或者很可能是 Sun)人员已将其实现到 API 文档中。
因此,您要做的是检查您向 ProcessBuilder 传递的变量是否符合您所理解的规范。为此,您可以模拟 ProcessBuilder,然后验证是否传递了正确的参数并在此类上调用了正确的方法。
总的来说,这是一个很难测试的问题,因为您不想测试 Windows 函数,而是想测试 java 与它们的交互。
//1 我在调用此外部命令时遇到的主要问题是正确理解 API 文档或设置命令。通常,您必须退出命令行并检查是否正确使用方法(尤其是 cmd 函数)。这可能意味着您要弄清楚如何使用 cmd 函数,将其编码到 ProcessBuilder 中,然后编写测试(或者在 ProcessBuilder/测试上反之亦然),这不是理想的方法,但有时文档很难理解。
关于java - 可以对 Windows 环境变量的修改进行单元测试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12252708/