Нужно написать валидатор для объектов с большим количеством полей, чтобы бы виден дифф по неравным полям. Пока кроме варианта перебирать все поля софт ассертами (потом переписать чтобы рефлексией вызывались все геттеры объекта) идей нет.
Возможно у кого-то есть опыт или идеи по написанию чего-то похожего.
есть несколько методов они отличаются удобством они рапортуют об отличиях.
assertTrue(CollectionUtils.containsAny(helpTopicArray,
new ArrayList<Object>(Arrays.asList(helpTopics))));
assertTrue(CollectionUtils.containsAny(helpTopicArray,
new ArrayList<Object>(Arrays.asList(helpTopics))));
assertFalse(new HashSet<Object>(keywordList)
.containsAll(new HashSet<Object>(supportedKeywordList)));
assertThat(new HashSet<Object>(supportedKeywordList),
hasItems(keywordArray));
ну и так далее - взято из одного проекта времени на примеры прям сечас нет
Вот ещё библиотечка интересная есть для сравнения объектов:
https://github.com/SQiShER/java-object-diff
Но я по-моему ею не стал пользоваться, какой-то свой костыль наваял…
Насчет вызовов гетеров в отражениях, то я бы сразу в поля смотрел, а не через методы ходил.
А лучше сделать реализацию типа компаратора или клонабла, который бы делал что-то типа equals()
только на выход не true/false или -1, 0, 1, а что-то типа Result(code, message)
.
Пример шаблона прототип: https://refactoring.guru/ru/design-patterns/prototype/java/example
Т.е. вашим классам добавить интерфейс Different (Verify, Check или как-то так ещё) и у него метод:
public Result diff(T object);
А в проверке сделать:
AssertTrue(ObjectExpected.diff(ObjectActual).getMessage(), ObjectExpected.diff(ObjectActual).getCode() == 0);
Ну, или как-то ещё…
Ещё как вариант в json преобразовать и сравнить json файлы…
действительно - hamcrest assertions неудовлетворительно работуют разницу когда она есть…сериализация помогает увидеть все отличия.
Google AssertReflectionEqulas