gpt4 book ai didi

java - Hamcrest 测试一个 map 是否包含另一个 map 中的所有条目

转载 作者:搜寻专家 更新时间:2023-10-31 19:39:01 26 4
gpt4 key购买 nike

我想检查 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这需要 SetIterable ,但它需要一个数组。 Set.toArray()返回 Object[] , 与 assertThat 不匹配针对你的actualMap.entrySet() - 但如果你删除 Matcher 的声明类型,它将愉快地继续。

如果你想要一个编译时没有警告的断言,它会变得更丑——你需要复制 Set进入某种Iterable<Object> (你不能施放)以匹配对象:

assertThat(new HashSet<Object>(actualMap.entrySet()), hasItems(expectedMap.entrySet().toArray()));

但老实说,为了清楚起见,您几乎可以肯定最好单独断言每个条目:

for (Entry<String, String> entry : expectedMap.entrySet()) {
assertThat(actualMap, hasEntry(entry.getKey(), entry.getValue()));
}

...或者您可以编写自己的匹配器 - 关于如何在线和在 SO 上执行此操作的资源很多。

关于java - Hamcrest 测试一个 map 是否包含另一个 map 中的所有条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21186369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com