15

我有两张HashMap<Integer, Question>地图要比较。Question在这种情况下是我写的一个Javabean。

我如何断言两者HashMap相等?在这种情况下,相等意味着两者都HashMap包含完全相同的Questionbean?

如果它完全相关,我正在使用 JUnit 编写单元测试。

4

8 回答 8

16

使用番石榴,您可以:

assertTrue(Maps.difference(expected, actual).areEqual());
于 2016-03-30T04:28:33.053 回答
6

这是我最终使用的解决方案,它非常适合单元测试。

for(Map.Entry<Integer, Question> entry : questionMap.entrySet()) {
    assertReflectionEquals(entry.getValue(), expectedQuestionMap.get(entry.getKey()), ReflectionComparatorMode.LENIENT_ORDER);
}

assertReflectionEquals()这涉及从unitils包中调用。

<dependency>
    <groupId>org.unitils</groupId>
    <artifactId>unitils-core</artifactId>
    <version>3.3</version>
    <scope>test</scope>
</dependency>
于 2013-09-06T06:43:51.620 回答
5

如果您的 Question 类实现equals了,那么您可以这样做

assertEquals(expectedMap, hashMap);

assertTrue(expectedMap.equals(hashMap));

Map 接口指定如果两个 Map 包含相等键的相等元素,则它们是相等的。

于 2013-09-05T04:03:26.937 回答
3

Here is how HashMap equal method works:

public boolean equals(Object o) {
..........
..........
 Map<K,V> m = (Map<K,V>) o;
..........
    Iterator<Entry<K,V>> i = entrySet().iterator();
    while (i.hasNext()) {
    Entry<K,V> e = i.next();
            K key = e.getKey();
            V value = e.getValue();
            if (value == null) {
                if (!(m.get(key)==null && m.containsKey(key)))
                    return false;
            } else {
                if (!value.equals(m.get(key)))
                    return false;
            }
...........
...........
 return true;
}

Now since, it is invoking the equals method of Value objects, that means Value objects for a given key should be same (as governed by equals method).

Above will help you to understand in what case your JUnit will pass. In your JUnit method you can use:

public static void assertEquals(java.lang.Object expected,
                                java.lang.Object actual)

See link for more details.

Cheers !!

于 2013-09-05T04:45:09.537 回答
3

也比较地图,在您的特定情况下:

1)检查地图的大小是否相等

然后使用

    `assertTrue(expectedMap.equals(hashMap));` 

在您的 Question bean 中,您必须覆盖 equals 和 hashcode 方法。

于 2013-09-05T04:33:54.573 回答
1

我发现map 类的keySet方法很有用

        assertEquals(map1.keySet(), map2.keySet());
于 2020-01-25T13:36:44.170 回答
0

如果您的 bean 类有一个字段,该字段对于您创建的每个对象都是唯一的,那么您应该使用该字段覆盖 bean 类中的 equals 和 hashcode 方法

于 2013-09-05T04:05:30.310 回答
0

您可以根据需要使用compare(-,-)(主要用于sorting目的)Comparator接口来实现对象之间的自定义比较。或者使用equals()方法来比较对象。

于 2013-09-05T04:48:29.383 回答