59. Исправить тест сравнения DTO
Условие задачи:
Дан record MyDto и тест, который сохраняет DTO, получает его обратно и сравнивает с исходным объектом.
Необходимо корректно реализовать сравнение объектов.
Код:
public record MyDto(
String name,
String description,
List<Integer> attrs
) {
}
@Test
void testDto() {
var myDto = new MyDto(
"name",
"desc",
List.of(
new Integer(1),
new Integer(2),
new Integer(3)
)
);
var id = create(myDto);
var actual = get(id);
assertThat(actual, equalTo(myDto));
}
Спойлеры к решению
Подсказки
💡
💡 Не смешивай синтаксис AssertJ и Hamcrest.
💡 Для AssertJ используется цепочка
💡 Создавать
record автоматически реализует equals() по всем компонентам.💡 Не смешивай синтаксис AssertJ и Hamcrest.
💡 Для AssertJ используется цепочка
assertThat(...).isEqualTo(...).💡 Создавать
Integer через конструктор не требуется.Решение
Вариант с AssertJ:
public record MyDto(
String name,
String description,
List<Integer> attrs
) {
}
@Test
void testDto() {
var expected = new MyDto(
"name",
"desc",
List.of(1, 2, 3)
);
var id = create(expected);
var actual = get(id);
assertThat(actual).isEqualTo(expected);
}
Для record компилятор автоматически создаёт метод equals(), который сравнивает все компоненты:
name;description;attrs.
Список также сравнивается по содержимому и порядку элементов.
Вариант с Hamcrest будет выглядеть так:
assertThat(actual, equalTo(expected));
Важно использовать assertThat() и equalTo() из Hamcrest либо полностью применять синтаксис AssertJ, не смешивая библиотеки.
Если тип и содержимое объекта, возвращённого методом get(id), совпадают с исходным DTO, тест успешно завершится.