Сравнить карты без учета заданных полей - PullRequest
0 голосов
/ 06 мая 2020

Я чувствую, что здесь не хватает чего-то очевидного, но документация меня подводит. Я пытаюсь сравнить две карты, игнорируя набор полей в assertJ. Я хотел бы увидеть этот проход assert:

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

Однако сравнение, которое на самом деле происходит, относится к объектам карты и не работает на таких вещах, как size, modCount, threshold, et c. Кроме того, он фактически не игнорирует поля, перечисленные при сравнении таблиц, ключей и значений. Я также пробовал использовать

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

, но это не удалось, потому что он пытался сравнить игнорируемые поля. Есть ли здесь элегантное решение, или мне придется вручную перебирать ключи?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

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 голосов
/ 06 мая 2020

На самом деле testPayload содержит эти пары ключ-значение:

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

Полезные данные сравнения содержат следующие пары ключ-значение:

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

То есть вам нужно применить .ignoringGivenFields(IGNORED_FIELDS) для обоих полезных данных для успешного выполнения. В вашей первой попытке вы удалили "another" из сравнения, но "ignored" остался в тестовой полезной нагрузке; и наоборот во второй попытке.

...