java - 比较忽略给定字段的地图
问题描述
我觉得我在这里遗漏了一些明显的东西,但是文档让我失望了。我试图比较两个地图,同时忽略 assertJ 中的一组字段。我想看到这个断言通过:
private static final String[] IGNORED_FIELDS = { "ignored", "another" };
private static final Map<String, Object> TEST_PAYLOAD = ImmutableMap.of("test", "payload", "example", "value", "ignored", "field");
private static final Map<String, Object> COMPARISON_PAYLOAD = ImmutableMap.of("test", "payload", "example", "value", "another", "ignored field");
// assert fails
assertThat(TEST_PAYLOAD).isEqualToIgnoringGivenFields(COMPARISON_PAYLOAD, IGNORED_FIELDS);
但是,实际发生的比较是映射对象,并且在大小、modCount、阈值等方面失败。此外,在比较表、键和值时,它实际上并没有忽略列出的字段。我也尝试过使用
assertThat(TEST_PAYLOAD).usingRecursiveComparison().ignoringGivenFields(IGNORED_FIELDS).isEqualTo(COMPARISON_PAYLOAD);
但这失败了,因为它试图比较被忽略的字段。这里有一个优雅的解决方案,还是我必须手动遍历键?
解决方案
ignoringGivenFields()
正如您所指出的,它将不起作用,因为它是一个ObjectAssert
,而不是一个方法,并且对对象的属性而不是映射的键进行操作。MapAssert
也就是说,我相信没有可以使用的内置 AssertJ 方法,但您可以编写自己的过滤器方法并在进行相等测试之前应用它:
private static <V> Map<String, V> filterIgnoredKeys(Map<String, V> map) {
return Maps.filterKeys(map, key -> !IGNORED_FIELDS.contains(key));
}
// later
assertThat(filterIgnoredKeys(TEST_PAYLOAD))
.isEqualTo(filterIgnoredKeys(COMPARISON_PAYLOAD))
如果您希望解决方案更优雅,可以尝试使用自己的自定义断言。
推荐阅读
- java - 如何使地图视图从当前位置获取?
- html - 从.net核心到角度的硬编码路径
- arrays - 从数组对象中获取值 - Woocommerce
- php - Laravel forge 失去与 SQL 的连接
- sas - SAS sftp 使用 LF 分隔符而不是 CRLF 发送文件
- node.js - 测试 GET 端点,使用 mocha 和 chai,AssertionError
- node.js - 如何从脚本命令访问 process.env 变量
- jquery - 使用 2 个过滤器 Jquery 动态过滤 Html 表
- sql - 日期 - 上一页。年份和当前 = sysdate
- javascript - 如何以 Reactive 形式动态设置默认值?