[英]Hamcrest test that a map contains all entries from another map
我想检查地图是否包含某组条目。 允许包含不在expectedMap
其他条目。 我目前有以下断言:
assertThat(expectedMap.entrySet(), everyItem(isIn(actualMap.entrySet())));
虽然这确实有效,但它打印的失败消息令人困惑,因为预期和接收的参数已从正常使用中反转。 有没有更好的方法来写它?
hasItems
做你想要的,但是以一种非显而易见的方式。 你必须跳过一些箍,因为Hamcrest对匹配Iterable
的支持相对有限。 (没有详细说明,这是由于Java泛型如何工作的变幻莫测 - 我将在稍后发布一些更详细的链接)。
(我假设你正在使用泛型,例如Map<String, String>
而不是简单的Map
)。
在此期间,您有几个选择......
如果您对在测试中使用@SuppressWarnings("unchecked")
引发警告的测试代码感到满意:
assertThat(actualMap.entrySet(), (Matcher)hasItems(expectedMap.entrySet().toArray()));
说明: hasItems
没有带有Set
或Iterable
重载,但是它需要一个数组。 Set.toArray()
返回Object[]
,它与assertThat
不匹配你的actualMap.entrySet()
- 但如果你删除了Matcher的声明类型,它将很乐意继续。
如果你想要一个在没有警告的情况下编译的断言,它会变得更加丑陋 - 你需要将Set
复制到某种Iterable<Object>
(你不能强制转换)以便在Objects上匹配:
assertThat(new HashSet<Object>(actualMap.entrySet()), hasItems(expectedMap.entrySet().toArray()));
但是说实话,为了清楚起见,你几乎肯定最好单独断言每个条目:
for (Entry<String, String> entry : expectedMap.entrySet()) {
assertThat(actualMap, hasEntry(entry.getKey(), entry.getValue()));
}
...或者你可以编写自己的匹配器 - 有很多关于如何在线和在线执行此操作的资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.