[英]How to assert two list values with contains, but not a exact equal comparison in java
[英]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.