Java Hamcrest测试一个映射是否包含来自另一个映射的所有条目
我想检查地图是否包含一组特定的条目。允许包含不在Java Hamcrest测试一个映射是否包含来自另一个映射的所有条目,java,hamcrest,Java,Hamcrest,我想检查地图是否包含一组特定的条目。允许包含不在expectedMap中的其他条目。我目前有以下主张: assertThat(expectedMap.entrySet(), everyItem(isIn(actualMap.entrySet()))); 虽然这确实有效,但它打印的失败消息令人困惑,因为预期和接收的参数已从正常使用中反转。有没有更好的方法来编写它?hasItems做你想做的事,但方式并不明显。由于Hamcrest对匹配Iterables的支持相对有限,因此您必须克服一些困难。(没
expectedMap
中的其他条目。我目前有以下主张:
assertThat(expectedMap.entrySet(), everyItem(isIn(actualMap.entrySet())));
虽然这确实有效,但它打印的失败消息令人困惑,因为预期和接收的参数已从正常使用中反转。有没有更好的方法来编写它?
hasItems
做你想做的事,但方式并不明显。由于Hamcrest对匹配Iterable
s的支持相对有限,因此您必须克服一些困难。(没有详细说明,这是由于Java泛型如何工作的变幻莫测——稍后我将发布更多的详细链接)
(我假设您使用的是泛型,例如Map
,而不是简单的Map
)
同时你有两个选择
如果您对在测试中使用@SuppressWarnings(“未选中”)
引发警告的测试代码感到满意:
assertThat(actualMap.entrySet(), (Matcher)hasItems(expectedMap.entrySet().toArray()));
说明:没有使用集合
或Iterable
的hasItems
重载,但它将使用数组Set.toArray()
返回Object[]
,它不会将assertThat
与您的actualMap.entrySet()
相匹配-但是如果您删除已声明的匹配器类型,它将愉快地继续
如果您想要一个编译时没有警告的断言,它会变得更丑陋-您需要将集合
复制到某种可编辑的
(您不能强制转换)中,以便在对象上匹配:
assertThat(new HashSet<Object>(actualMap.entrySet()), hasItems(expectedMap.entrySet().toArray()));
assertThat(新HashSet(actualMap.entrySet()),hasItems(expectedMap.entrySet().toArray());
但说实话,为了清楚起见,您几乎可以肯定最好单独声明每个条目:
for (Entry<String, String> entry : expectedMap.entrySet()) {
assertThat(actualMap, hasEntry(entry.getKey(), entry.getValue()));
}
for(条目:expectedMap.entrySet()){
资产(actualMap、hasEntry(entry.getKey()、entry.getValue());
}
…或者你可以编写自己的Matcher-关于如何在线完成这项工作,有很多资源。是的,我问这个问题的一个原因是因为我对警告或演员阵容不满意。很难看。我同意最后一个选择可能是目前最好的选择。我在过去写过一些匹配者,如果我需要再做一次,我会为它写一个。