2015-05-04 75 views
1

我有一个简单的JUnit测试,它检查两个文件具有相同的内容。它在我的Unix笔记本电脑中工作得很好。比较依赖于操作系统的文件。 JUnit

这是测试:

boolean response = false; 
    try { 
     File got = File.createTempFile("got-", ".csv"); 
     String outputPath = got.getAbsolutePath(); 
     testedObject.createCsvFile(outputPath); 
     got = new File(outputPath); 
     String expectedFilePath = getClass().getClassLoader().getResource("expected.csv").getFile(); 
     File expected = new File(expectedFilePath); 
     response = FileUtils.contentEquals(got, expected); // Here it is the key 
    } catch (IOException e) { 
     // Nothing to do Yay! 
    } 
    Assert.assertTrue(response); 

它的工作原理,因为如果我手动比较这两个文件,通过diff命令例子,是完全一样的。现在。
我的teem-mate代码与Windows笔记本电脑,当他跑了测试它打倒了!我们开始调试。

可见,两个文件是相同的;我的意思是在修订版中,您无法实现任何区别。但是如果在我们执行的Cwin终端上: diff expected.csv got.csv和windows认为每一行都不一样
然后测试就落了。

问题是,操作系统是什么?如果这是真的,有没有什么办法可以比较文件内容不依赖手术系统

回答

1

我的猜测是,这是最有可能的,这是由于\ N值,这在类似Unix的软件\ r \ ñ。

无论如何,查看两个文件是否具有相同内容的正确方法是对它们进行哈希(即通过sha1)并检查哈希是否匹配!

+0

非常喜欢你的答案。你能解释一下如何比较两个文件散列? – Manu

+1

我不是java专家=)但显然这个答案是你想要的http://stackoverflow.com/questions/6293713/java-how-to-create-sha-1-for-a-file然后只是比较两个散列值 – Andrea

+0

“正确的方法检查散列是否匹配”不!唯一可以用这种检查来断言的是两个文件都不相等。如果散列值相等,则不能确定文件是否相同(尽管它们很可能)。这不是正确的方法。 – Seelenvirtuose

0

此行为可归因于Line Feed在两个操作系统上都不相同。 如果你希望它是独立的平台,你应该使用

System.getProperty("line.separator"); 

而且运行时拿起价值,你可能想看看字符编码为文件