在 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 WindowsPath
和 UnixPath
存在。
编写大部分测试用例,使其在两个平台上都能工作。 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")));
}
我想测试一种方法,它可以找到两条路径 (found here) 中最长的公共子路径。 由于程序应该 运行 在 Windows 和 Linux 下,我想创建具有 Linux 路径的测试和具有 Windows 路径的其他测试。
问题是,Windows 测试仅在 Windows 环境中通过,而在 Linux 环境中失败。 对于 Linux 测试,情况正好相反。
我可以通过在进行实际测试之前检查 OS 来缓解这个问题。例如:org.junit.Assume.assumeTrue(isWindows());
但是随后测试总是在我们的 Jenkins 实例中通过,即 Linux 上的 运行。
这并不理想。
我不认为这是可能的,因为 Windows 的 JDK 只包含 WindowsPath
class。
这个工作的最低限度是 classes WindowsPath
和 UnixPath
存在。
编写大部分测试用例,使其在两个平台上都能工作。 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")));
}