【问题标题】:Compare maps ignoring given fields比较忽略给定字段的地图
【发布时间】:2020-05-06 17:26:38
【问题描述】:

我觉得我在这里遗漏了一些明显的东西,但是文档让我失望了。我试图比较两张地图,同时忽略了 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);

但这失败了,因为它试图比较被忽略的字段。这里有一个优雅的解决方案,还是我必须手动遍历键?

【问题讨论】:

  • ImmutableMap.of() 存在吗? Map.of() 已经不可变了?
  • @WJS 抱歉,这来自 Google Guava,但它们在所有意图和目的上都是相同的。
  • 好的,很遗憾我无法提供任何帮助。但是您可能应该将 Guava 标签添加到您的问题中。

标签: java guava assertj


【解决方案1】:

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))

如果您希望解决方案更优雅,可以尝试your own custom assertion

【讨论】:

  • 我最终还是用自定义过滤器编写了自己的过滤器。我希望有一个开箱即用的解决方案,这样我就不必维护代码,但没有是合理的。
  • 这是 AssertJ RecursiveComparison 中的一个错误,它不能正确处理地图的忽略字段。
  • 这是问题:github.com/assertj/assertj-core/issues/2115 将在下一个版本(3.20.0 或 3.19.1)中修复
【解决方案2】:

testPayload 实际上包含这些键值对:

"test" -> "payload", 
"example" -> "value", 
"ignored" -> "field"

比较有效负载具有以下键值对:

"test" -> "payload", 
"example" -> "value", 
"another" -> "ignored field"

也就是说,您需要将.ignoringGivenFields(IGNORED_FIELDS) 应用于两个有效负载才能成功。在您的第一次尝试中,您从比较中删除了"another",但"ignored" 仍保留在测试有效负载中;在第二次尝试中反之亦然。

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2013-01-04
    • 2016-01-29
    相关资源
    最近更新 更多