我在junit中比较文本文件,使用:
public static void assertReaders(BufferedReader expected,
BufferedReader actual) throws IOException {
String line;
while ((line = expected.readLine()) != null) {
assertEquals(line, actual.readLine());
}
assertNull("Actual had more lines then the expected.", actual.readLine());
assertNull("Expected had more lines then the actual.", expected.readLine());
}
这是比较文本文件的好方法吗?首选什么?
9条答案
按热度按时间vltsax251#
这里有一个简单的方法来检查文件是否 * 完全 * 相同:
其中,
file1
和file2
是File
示例,而FileUtils
来自Apache Commons IO。没有太多自己的代码需要维护,这总是一个优点。:)如果你已经在你的项目中使用了Apache Commons,这很容易。但是没有像mark的解决方案中那样漂亮、详细的错误消息。
编辑:
仔细看看
FileUtils
API,还有一种更简单的方法:作为一个额外的好处,这个版本适用于所有文件,而不仅仅是文本。
sqserrrh2#
junit-addons对此有很好的支持:FileAssert
它提供了如下例外:
dtcbnfnu3#
以下是各种第三方Java库中的文件比较器的更详尽列表:
k97glaaz4#
在2015年,我会重新注解AssertJ,一个优雅而全面的Assert库。
或针对内联字符串:
失败消息的信息量也很大。如果某行不同,则会得到:
如果其中一个文件有更多行,则会得到:
of1yzvn45#
使用
java.nio.file
API对两个文件的内容进行简单比较。或者,如果要比较单个行:
nkhmeac66#
我建议使用Assert.assertThat和一个hamcrest matcher(junit 4.5或更高版本--甚至可能是4.4)。
我会得到这样的结论:
我的匹配器在哪里:
比赛职业选手:
缺点:
wxclj1h57#
FileUtils
当然是一个很好的方法。这里还有另一个简单的方法来检查文件是否完全相同。虽然assertEquals()确实比assertTrue()提供了更多的反馈,但checksumCRC32()的结果是long。因此,这可能没有本质上的帮助。
4c8rllxm8#
如果expected的行数比实际的多,那么在稍后到达assertNull之前,您将使assertEquals失败。
不过,修复起来相当容易:
erhoui1w9#
这是我自己实现的
equalFiles
,不需要在项目中添加任何库。要使用它,只需使用常规的
AssertTrue
JUnit方法