难以理解的JUnit错误

时间:2018-04-12 22:59:45

标签: java junit

尝试通过预先将它们转换为列表来测试两个地图(包括订单)的相等性。可能有更好的方法,但我想知道为什么会出现这个错误。这是测试:

@Test
public void sortedEntriesTest() {
    List<Map.Entry<String, AtomicInteger>> actualList = stream.sortedEntries(stream.getMap());
    List<Map.Entry<String, AtomicInteger>> expectedList = 
                                              expectedMap.entrySet()
                                                         .stream()
                                                         .sorted(Comparator.comparingInt(e -> -e.getValue().get()))
                                                         .collect(Collectors.toList());
    Assert.assertThat(expectedList, is(actualList));
}

这是错误:

java.lang.AssertionError: 
Expected: is <[file=1, for=1, project=1, is=1, an=1, just=1, example=1, this=2]>
 but: was <[file=1, for=1, project=1, is=1, an=1, just=1, example=1, this=2]>
Expected :is <[file=1, for=1, project=1, is=1, an=1, just=1, example=1, this=2]>

Actual   :<[file=1, for=1, project=1, is=1, an=1, just=1, example=1, this=2]>

2 个答案:

答案 0 :(得分:2)

尝试

Assert.assertThat(expectedList, is(equalTo(actualList)));

代替。

答案 1 :(得分:1)

说明:

您正在比较两个不同对象的引用,这些对象(就像对象一样)不同。这就是为什么你得到AssertionError - 第一个引用是而不是第二个引用。

解决方案:

使用equals方法(link to the Java documentation for List.equals()),它还会通过调用Map's equals method来比较列表的内容。

Assert.assertTrue(expectedList.equals(actualList));

Documentation on Assert.assertTrue

另外,请检查此StackOverflow问题和第一个(选定的)答案 - comparing two maps

修改

由于您告诉错误仍在此处,因此可能是列表项中的问题。您应该检查Map.EntryexpectedList中的actualList个实例的创建方式。它们的实际类型可能不同,因为Map.Entry只是一个界面。

另外,我建议您使用更简单的方法获取所需的值进行比较。