#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(", "));
}
чего я предпочитаю избегать (эти ужасные вспомогательные методы)…