在 JUnit 测试中明确使用 UnixPath 或 Windows Path

Explicitely use UnixPath or WindowsPath in JUnit test

我想测试一种方法,它可以找到两条路径 (found here) 中最长的公共子路径。 由于程序应该 运行 在 Windows 和 Linux 下,我想创建具有 Linux 路径的测试和具有 Windows 路径的其他测试。

问题是,Windows 测试仅在 Windows 环境中通过,而在 Linux 环境中失败。 对于 Linux 测试,情况正好相反。

我可以通过在进行实际测试之前检查 OS 来缓解这个问题。例如:org.junit.Assume.assumeTrue(isWindows()); 但是随后测试总是在我们的 Jenkins 实例中通过,即 Linux 上的 运行。 这并不理想。

我不认为这是可能的,因为 Windows 的 JDK 只包含 WindowsPath class。 这个工作的最低限度是 classes WindowsPathUnixPath 存在。

编写大部分测试用例,使其在两个平台上都能工作。 Windows Path 处理对使用 Linux 路径非常宽容。如果你小心地构建你的测试数据,这样你就永远不会将路径转换回字符串,你的 Linux 路径测试应该在 Windows 上工作,因为你可以省略提及 Windows 驱动器号作为字符串值.

例如,在两个平台上尝试这些测试。 Windows 路径处理会在内部自动处理错误的路径分隔符样式,但除非您将 Path 转换回 String:

,否则永远不会暴露这一点
@Test void testsCommonToAllPlatforms() {
  Assertions.assertEquals(Path.of("/a/b"), commonPath(Path.of("/a/b/c"), Path.of("/a/b/d")));
  Assertions.assertEquals(Path.of("a/b"),  commonPath(Path.of("a/b/c"),  Path.of("a/b/d")));
  Assertions.assertEquals(Path.of("/"),    commonPath(Path.of("/a/b/c"), Path.of("/d/e/f")));
  Assertions.assertEquals(        null,    commonPath(Path.of("a/b/c"),  Path.of("d/e/f")));
}

这会让您设置一些额外的 Windows 特定测试(除上述之外),其中可能包括驱动器盘符,并且您现在需要访问 Windows 构建机器并且然后验证没有回归:

@EnabledOnOs(OS.WINDOWS)
@Test void testJustForWindows() {
  Assertions.assertEquals(Path.of("C:/Winnt"), commonPath(Path.of("C:/Winnt/System32"), Path.of("C:/Winnt/System64"))));
  Assertions.assertEquals(               null, commonPath(Path.of("C:/Winnt/System32"), Path.of("F:/Winnt/System32")));
}