我想要比较两张HashMap<Integer, Question>
地图。在这种情况下,Question
是我写过的Javabean。
我如何断言两个HashMap
是平等的?在这种情况下,相等意味着HashMap
都包含完全相同的Question
bean?
如果完全相关,我正在使用JUnit编写单元测试。
答案 0 :(得分:9)
使用番石榴你可以做到:
assertTrue(Maps.difference(expected, actual).areEqual());
答案 1 :(得分: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>
答案 2 :(得分:3)
在特定情况下比较地图:
1)检查地图的大小是否等于
然后使用
`assertTrue(expectedMap.equals(hashMap));`
在你的问题bean中,你必须覆盖equals和hashcode方法。
答案 3 :(得分:2)
以下是HashMap等值方法的工作原理:
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)
有关详细信息,请参阅link。
干杯!!
答案 4 :(得分:1)
如果您的问题类实现equals
,那么您可以执行
assertEquals(expectedMap, hashMap);
assertTrue(expectedMap.equals(hashMap));
Map接口指定两个Maps相等,如果它们包含相等键的相等元素。
答案 5 :(得分:1)
我发现地图类的 keySet 方法很有用
assertEquals(map1.keySet(), map2.keySet());
答案 6 :(得分:0)
如果您的bean类有一个对您创建的每个对象都是唯一的字段,那么您应该使用该字段覆盖ur bean类中的equals和hashcode方法
答案 7 :(得分:0)
您可以使用compare(-,-)
接口的sorting
(主要用于Comparator
目的)来实现对象之间的自定义比较。或者使用equals()
方法来比较对象。