繁体   English   中英

我如何断言两个具有 Javabean 值的 HashMap 相等?

[英]How do I assert that two HashMap with Javabean values are equal?

我有两个要比较的HashMap<Integer, Question>映射。 本例中的Question是我编写的 Javabean。

我如何断言两个HashMap是相等的? 在这个场景中,equal 意味着两个HashMap包含完全相同的Question bean?

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

使用番石榴,您可以:

assertTrue(Maps.difference(expected, actual).areEqual());

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

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>

如果你的 Question 类实现了equals那么你就可以做

assertEquals(expectedMap, hashMap);

assertTrue(expectedMap.equals(hashMap));

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

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

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

然后使用

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

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

下面是 HashMap equal 方法的工作原理:

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;
}

现在,它调用 Value 对象的 equals 方法,这意味着给定键的 Value 对象应该相同(由 equals 方法控制)。

以上将帮助您了解您的 JUnit 在什么情况下会通过。 在您的 JUnit 方法中,您可以使用:

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

有关更多详细信息,请参阅链接

干杯!!

我发现地图类的keySet方法很有用

        assertEquals(map1.keySet(), map2.keySet());

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

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

 assertEquals(expected.toString(), actual.toString());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM