java - 可以对 Windows 环境变量的修改进行单元测试吗?

标签 java unit-testing environment-variables

我的进程只是将一些内容添加到系统变量PATH中。实际上,我正在使用使用 setx.exeProcess 来执行此操作:

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/

相关文章:

java - 无法chmod文件夹写入

python - 如何在运行时跳过整个 Python 'unittest' 模块?

python - 如何使用当前 conda 环境的 python 路径作为脚本的 shebang?

java - 不支持的操作系统

java - 返回使用正则表达式找到的字符串

java - 使用 Java Sound API 从麦克风阵列同步录音

javascript - 对 AngularJS 指令的 Controller 进行单元测试(Karma、Chai、Mocha)

java - Mockito:获取模拟对象中字段的值

java - 如何仅使用命令行将环境变量传递给 gradle 包装器构建?

java - 更改java版本Windows