以下JUnit 4测试在Linux和Windows下可以正常运行:

public class TmpFileTest {

    @Rule
    public TemporaryFolder tmp = new TemporaryFolder();

    @Test
    public void test() throws Exception {
        File tmpFile = tmp.newFile();
        Assert.assertEquals(tmpFile, tmpFile.getCanonicalFile());
    }

}


但是断言在Mac上失败(已通过Sierra 10.12.4测试):

java.lang.AssertionError:
Expected :/var/folders/q4/rj3wqzms2fdcqlxgdzb3l5hc0000gn/T/junit1451860092188597816/junit1906079638039608483.tmp
Actual   :/private/var/folders/q4/rj3wqzms2fdcqlxgdzb3l5hc0000gn/T/junit1451860092188597816/junit1906079638039608483.tmp


var是指向private/var的符号链接,可通过File#getCanonicalFile()进行解析-这是区别。

有没有办法解决这个问题?这会在我的机器上导致大量测试失败。

最佳答案

我想您仍然需要验证两条路径是否相同。

因此,您可以尝试使用getCanonicalFile(),而不必尝试解决getCanonicalFile()的工作原理(它解决符号链接,没有办法解决),您可以接受它,并且在最终测试中,可以在两端使用。

File expectedFile = ...
File actualFile = ...
assertEquals(expectedFile.getCanonicalFile(), tmpFile.getCanonicalFile());


那,或者:

java.nio.file.Files.isSameFile(expectedFile.toPath(), actualFile.toPath())

09-05 02:13