t.me/atinfo_chat Telegram группа по автоматизации тестирования

SoftAssert для разных объектов с большим количеством полей

assert
java
Теги: #<Tag:0x00007f21d8d8d050> #<Tag:0x00007f21d8d8cee8>

(Aliaksandr) #1

Нужно написать валидатор для объектов с большим количеством полей, чтобы бы виден дифф по неравным полям. Пока кроме варианта перебирать все поля софт ассертами (потом переписать чтобы рефлексией вызывались все геттеры объекта) идей нет.
Возможно у кого-то есть опыт или идеи по написанию чего-то похожего.


(Сергей Кузьмин) #2

есть несколько методов они отличаются удобством они рапортуют об отличиях.

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

ну и так далее - взято из одного проекта времени на примеры прям сечас нет


(Михаил Братухин) #3

Вот ещё библиотечка интересная есть для сравнения объектов:
https://github.com/SQiShER/java-object-diff
Но я по-моему ею не стал пользоваться, какой-то свой костыль наваял… :grin:

Насчет вызовов гетеров в отражениях, то я бы сразу в поля смотрел, а не через методы ходил.
А лучше сделать реализацию типа компаратора или клонабла, который бы делал что-то типа 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);

Ну, или как-то ещё… :smile:

Ещё как вариант в json преобразовать и сравнить json файлы…


(Сергей Кузьмин) #4

действительно - hamcrest assertions неудовлетворительно работуют разницу когда она есть…сериализация помогает увидеть все отличия.


#5

Google AssertReflectionEqulas