我的问题是,这个
我编写了一个函数,该函数创建一个指向给定父目录中特定目录的符号链接。它不直接创建链接,而是创建一个tmp链接,然后将tmp链接移动到所需的路径,因为移动操作是原子的,而覆盖操作不是。
public static void updateMySymlink(final Path parentDir, final String targetDirName) {
final Path targetPath = parentDir.resolve(targetDirName);
final Path tempPath = parentDir.resolve("tmp");
final Path symlinkPath = parentDir.resolve("mySymlink");
Files.createSymbolicLink(tempPath, targetPath);
Files.move(tempPath, symlinkPath, ATOMIC_MOVE);
}
当我试着对它进行单元测试时,我写了这样一个测试:
@Test
public void testSymlinkCreation() {
final Path targetPath = localRepoPath.resolve("target");
final Path symlinkPath = localRepoPath.resolve("mySymlink");
FileUtils.forceMkdir(targetPath.toFile());
updateMySymlink(localRepoPath, "testCommitId1"); // static method
assertThat(targetPath).isEqualTo(symlinkPath.toRealPath());
}
测试失败,提示:
org.junit.ComparisonFailure: expected:</[private/]tmp/testDirToCreate-...> but was:</[]tmp/testDirToCreate-...>
无论输入路径如何改变,这个private/
保持不变。我尝试断言绝对路径或归一化后的路径,但仍然因为相同的错误而失败。
我的问题是,这个private/
来自哪里?
发现问题是我只在symlinkPath
上使用.toRealPath()
。将断言修改为:
assertThat(targetPath.toRealPath()).isEqualTo(symlinkPath.toRealPath());
解决了问题。