我正在运行以下测试来检查两个列表是否相同:
public void testSortInputStream() throws IOException {
field = "User ID";
streamSorter.sort(inputStream, outputStream, comparator);
Reader actualCSVReader = new BufferedReader(outputStreamToInputStreamReader(outputStream));
Reader expectedCSVReader = new BufferedReader(new InputStreamReader(expectedStream));
List<CSVRecord> actualCSVRecords = CSVFormat.RFC4180.parse(actualCSVReader).getRecords();
List<CSVRecord> expectedCSVRecords = CSVFormat.RFC4180.parse(expectedCSVReader).getRecords();
Assert.assertEquals(expectedCSVRecords, actualCSVRecords);
}
奇怪的是,断言失败并显示以下消息:
expected: java.util.ArrayList<[CSVRecord [comment=null, mapping=null, recordNumber=1, values=[10, Ruby, Wax, ruby, Employee, 12-12-2014 08:09:13]], CSVRecord [comment=null, mapping=null, recordNumber=2, values=[3, David, Payne, Dpayne, Manager, 23-09-2014 09:35:02]]]>
but was: java.util.ArrayList<[CSVRecord [comment=null, mapping=null, recordNumber=1, values=[10, Ruby, Wax, ruby, Employee, 12-12-2014 08:09:13]], CSVRecord [comment=null, mapping=null, recordNumber=2, values=[3, David, Payne, Dpayne, Manager, 23-09-2014 09:35:02]]]>
但是,如果比较这两个列表,它们是绝对相同的。我在这里错过了什么?
最佳答案
根据 CSVRecord
's javadoc你链接的,CSVRecord
不会覆盖 equals(Object)
- 它继承了 java.lang.Object
的默认实现.因此,您不能依赖它进行相等性检查,包括嵌套检查,例如 List<CSVRecord>
.它并不完美,但您可以使用一个肮脏的技巧来转换您的 CSVRecord
s 到字符串,并比较它们的表示:
List<String> actualCSVRecords =
CSVFormat.RFC4180
.parse(actualCSVReader)
.getRecords()
.stream()
.map(Object::toString)
.collect(Collectors.toList());
List<String> expectedCSVRecords =
CSVFormat.RFC4180
.parse(expectedCSVReader)
.getRecords()
.stream()
.map(Object::toString)
.collect(Collectors.toList());
Assert.assertEquals(expectedCSVRecords, actualCSVRecords);
关于java - 比较两个相同列表时 assertEquals 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41463538/