Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hamcrest测试一个映射是否包含来自另一个映射的所有条目_Java_Hamcrest - Fatal编程技术网

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-关于如何在线完成这项工作,有很多资源。

是的,我问这个问题的一个原因是因为我对警告或演员阵容不满意。很难看。我同意最后一个选择可能是目前最好的选择。我在过去写过一些匹配者,如果我需要再做一次,我会为它写一个。