java - 比较映射忽略给定字段

标签 java guava assertj

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

但是,实际发生的比较是 map 对象的比较,并且在大小、modCount、阈值等方面失败。此外,它实际上不会忽略在比较表、键和值时列出的字段。我也尝试过使用

  assertThat(TEST_PAYLOAD).usingRecursiveComparison().ignoringGivenFields(IGNORED_FIELDS).isEqualTo(COMPARISON_PAYLOAD);

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

最佳答案

ignoringGivenFields() 不起作用,因为它是一个 ObjectAssert,而不是 MapAssert 方法,并且对对象的属性而不是 map 的键进行操作,正如您所指出的。

也就是说,我相信没有可以使用的内置 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 .

关于java - 比较映射忽略给定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61641396/

相关文章:

Java:按第一列(int 填充)对二维数组进行排序

java - 尝试编译 Cyber​​duck 和 ant 错误

java - 根据 AssertJ 中的原始值检查从 Collection 中提取的值

java - 如何确保一个字符串恰好有 n 次子串?

java - 有效地 "modifying"一个 ImmutableMap

java - 使用 JUnit 和 AssertJ 测试数组是否包含元素

java - 如何使用 Java 处理 Selenium WebDriver 中的弹出窗口

JAVA - swt,我们是否必须为每个操作系统重新制作字节码?

java - 为什么原始类型没有 guava Objects.equal(Object, Object) ?

java - 可调用.getReturnType() : cannot reproduce Guava's example from the official wiki