我正在创建一个JUnitTest
测试,用于比较使用基准文件创建的文件,该文件存在于Eclipse中src
文件夹的resources文件夹中。
代码
public class CompareFileTest
{
private static final String TEST_FILENAME = "/resources/CompareFile_Test_Output.xls";
@Test
public void testCompare()
{
InputStream outputFileInputStream = null;
BufferedInputStream bufferedInputStream = null;
File excelOne = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Input1.xls");
File excelTwo = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Input1.xls");
File excelThree = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Output.xls");
CompareFile compareFile = new CompareFile(excelOne, excelTwo, excelThree);
// The result of the comparison is stored in the excelThree file
compareFile.compare();
try
{
outputFileInputStream = new FileInputStream(excelThree);
bufferedInputStream = new BufferedInputStream(outputFileInputStream);
assertTrue(IOUtils.contentEquals(CompareFileTest.class.getResourceAsStream(TEST_FILENAME), bufferedInputStream));
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
但是,我收到一条Assertion Error消息,没有任何细节。由于我刚从比较文件操作创建基准文件,因此两个文件应该完全相同。
提前致谢!
编辑:在评论之后,我使用了文件差异工具,发现两个文件都不同,但由于它们是副本,我不确定是怎么回事。也许有时间戳或什么?答案 0 :(得分:2)
IOUtils.contentEquals()
并未声称提供的信息比布尔“匹配或不匹配”更多,因此您无法从中获取额外信息。
如果你的目的只是为了弄清楚这两个文件不同的原因,你可以放弃Java并使用其他工具来比较文件。例如https://superuser.com/questions/125376/how-do-i-compare-binary-files-in-linux
如果您的目标是让jUnit测试在文件不匹配时为您提供更多信息(例如,例外情况可能是Expected files to match, but byte 5678 differs [0xAE] vs [0xAF]
),则需要使用IOUtils.contentEquals()
之外的其他内容 - 通过滚动自己,或在Comparing text files w/ Junit
答案 1 :(得分:0)
我有一个类似的问题。
我使用的是JUNIT断言库断言,并且得到了要比较的内存地址,而不是实际的文件。
我没有将InputStream对象进行比较,而是将它们转换为字节数组并进行了比较。这不是绝对的特价,但我敢宣称,如果字节数组相同,则基础InputStream及其文件具有相等的很大机会。
像这样:
Assertions.assertEquals(
this.getClass().getResourceAsStream("some_image_or_other_file.ext").readAllBytes(),
someObject.getSomeObjectInputStream().readAllBytes());
不确定对于较大的文件,此比例是否可以缩放。对于复杂的差异当然不是很好,但是它确实可以断言。