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