我需要为单元测试做这个。正在测试的方法返回一个ImmutbaleMap,我需要能够将它与我已经拥有的那个进行比较。一种方法是为两个(keySets())获取密钥集,运行它们并比较这两个映射返回的值。然而,对我来说这似乎有点低效。有更好/首选的方法吗?
答案 0 :(得分:6)
如果密钥和值都正确实现equals()
,您只需使用Map.equals()
:
将指定对象与此映射进行相等性比较。如果给定对象也是地图并且两个地图表示相同的映射,则返回
true
。更正式地说,如果m1
,则两个地图m2
和m1.entrySet().equals(m2.entrySet())
代表相同的映射。这可确保equals
方法在Map
接口的不同实现中正常工作。
如果他们不这样做,我怀疑你会找到一个开箱即用的单线程。我希望你必须自己实施比较。这并不难:
这可以很容易地封装到辅助函数中,可能由值比较器参数化。
答案 1 :(得分:1)
补充@ NPE的答案......
由于您的值未正确实现.equals()
/ .hashCode()
,因此地图上的简单等号将无效;但你用的是番石榴;因此,您可以选择实施Equivalence。
这意味着,如果您的值类为Foo
:
Equivalence<Foo>
:Map<X, Equivalence.Wrapper<Foo>>
。有了这个,您就可以使用Map
的{{1}}。
答案 2 :(得分:0)
另一个选择是使用普通Map,写出等价的暗示并使用difference
类
Maps
方法
MapDifference<K,V> difference(Map<? extends K,? extends V> left,
Map<? extends K,? extends V> right,
Equivalence<? super V> valueEquivalence)
我更喜欢这种方式,因为它不会改变Map类型(不会只是为了计算差异或检查相等性)。
答案 3 :(得分:0)
为什么map1.entrySet().equals(map2.entrySet())
不起作用?
EntrySet.equals()
方法引用的Map.contains()
方法应该适用于您的值,无论它们是否实现equals()
(在这种情况下,您可能具有IdentityHashMap底层)。