尝试通过预先将它们转换为列表来测试两个地图(包括订单)的相等性。可能有更好的方法,但我想知道为什么会出现这个错误。这是测试:
@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]>
答案 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.Entry
和expectedList
中的actualList
个实例的创建方式。它们的实际类型可能不同,因为Map.Entry
只是一个界面。
另外,我建议您使用更简单的方法获取所需的值进行比较。