比较地图,忽略给定字段

问题描述 投票:0回答:2

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

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

java guava assertj
2个回答
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))

如果你想让解决方案更优雅的话,你可以试验一下: 你自己的定制说法.


0
投票

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

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

比较有效载荷有这些键值对。

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

也就是说,你需要应用 .ignoringGivenFields(IGNORED_FIELDS) 到两个有效载荷上才能成功。 在您的第一次尝试中,您删除了 "another" 相比之下,但 "ignored" 仍在测试有效载荷中;第二次尝试时,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.