Повторное использование итеративного валидатора различий AssertJ в пользовательском классе утверждений

#assertj

Вопрос:

Я реализовал расширение пользовательских утверждений AbstractAssert .

Мой объект содержит несколько коллекций, которые должны точно совпадать, и я хочу представить сообщение о том, что поле X не совпадает, isEqualTo и разница в том, что отсутствуют элементы [a1, a2] и дополнительные элементы [b1, b2, b3].

В пакете есть org.assertj.core.internal.IterableDiff и другие internal , но я не могу найти какую-либо универсальную проверку/форматирование, которая помогла мне обнаружить и распечатать разницу.

Я закончил с пользовательским кодом:

 public IdsAssert isEqualTo(Ids expected) {
    areSame("getAgencyIds()", actual.getAgencyIds(), expected.getAgencyIds());
    areSame("getBranchIds()", actual.getBranchIds(), expected.getBranchIds());
//  Assertions.assertThat(actual.getAgencyIds()).containsExactlyElementsOf(expected.getAgencyIds());
//  Assertions.assertThat(actual.getBranchIds()).containsExactlyElementsOf(expected.getBranchIds());
    return this;
}

private static <T> void areSame(String field, Set<T> col1, Set<T> col2) throws AssertionError {
    Set<T> copy1 = new HashSet<>(col1);
    Set<T> copy2 = new HashSet<>(col2);
    copy1.removeAll(col2);
    copy2.removeAll(col1);

    String buf = "";
    if ( ! copy1.isEmpty()) {
        buf  = String.format("Found extra elements:n  %sn", format(copy1));
    }
    if ( ! copy2.isEmpty()) {
        buf  = String.format("Found missing elements:n  %sn", format(copy2));
    }

    if (buf.isEmpty()) { return; }
    throw new AssertionError(String.format("nIds are not the same: %s differ.n%s", field, buf));
}

private static <T> String format(Set<T> col) {
    return col.stream()
            .map(__ -> String.format("[%s]", __))
            .collect(Collectors.joining(", "));
}
 

чего я предпочитаю избегать (эти ужасные вспомогательные методы)…