Найти и исправить проблему в тесте сравнения DTO

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

Спойлеры к решению

Подсказки
💡 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, тест успешно завершится.