Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Сравнение объектов в тестах #33

Merged
merged 20 commits into from
Aug 2, 2024

Conversation

funnyDevGirl
Copy link

Теперь для сравнения объектов в тестах не требуется работать напрямую с json, а сравнивать java-объекты.

Было:

        var request = get("/api/posts/" + testPost.getId()).with(jwt());
        var result = mockMvc.perform(request)
                .andExpect(status().isOk())
                .andReturn();
        var body = result.getResponse().getContentAsString();
        assertThatJson(body).and(
                v -> v.node("slug").isEqualTo(testPost.getSlug()),
                v -> v.node("name").isEqualTo(testPost.getName()),
                v -> v.node("body").isEqualTo(testPost.getBody()));

Стало:

        String body = response.getContentAsString();

        PostDTO postDTO = om.readValue(body, PostDTO.class);
        PostDTO testPostDTO = postMapper.map(testPost);

        assertThat(postDTO.getName()).isEqualTo(testPostDTO.getName());
        assertThat(postDTO.getSlug()).isEqualTo(testPostDTO.getSlug());
        assertThat(postDTO.getBody()).isEqualTo(testPostDTO.getBody());

@fey fey requested a review from Malcom1986 May 28, 2024 12:13
@funnyDevGirl
Copy link
Author

funnyDevGirl commented May 30, 2024

Ранее при проверке получения списка сущностей из контроллера проверялся только тип данных - список.

    @Test
    public void testIndex() throws Exception {
        postRepository.save(testPost);
        var result = mockMvc.perform(get("/api/posts").with(token))
                .andExpect(status().isOk())
                .andReturn();
        var body = result.getResponse().getContentAsString();
        assertThatJson(body).isArray();
    }

Теперь проверяется не только тип данных, но и содержимое этого списка:

    @Test
    public void testIndex() throws Exception {
        var response = mockMvc.perform(get("/api/posts").with(token))
                .andExpect(status().isOk())
                .andReturn()
                .getResponse();

        String body = response.getContentAsString();

        List<PostDTO> postDTOS = om.readValue(body, new TypeReference<>() {});

        List<Post> actual = postDTOS.stream().map(postMapper::map).toList();
        List<Post> expected = postRepository.findAll();

        Assertions.assertThat(actual).containsAll(expected);
    }

@Malcom1986
Copy link
Contributor

Привет! Мы тестируем апи и сейчас напрямую проверяем этот апи. То есть мы говорим, что должны получить в ответе JSON, что у него должны быть такие-то ключи с такими-то значениями.
При использовании же маппера, если я накосячу в маппере, такой тест будет проходить. Так как и фактическое и эталонное значение будут преобразованы одним и тем же маппером с косяком. Например, в ответе не будет приходить слаг поста и такой тест все равно пройдет. А сейчас, напрямую проверяя полученный json, мы получим читаемый вывод, что такой ноды slug не существует

@Malcom1986 Malcom1986 marked this pull request as draft July 1, 2024 08:37
@s-chepurnov
Copy link

Все тесты возвращены в исходное состояние, но тесты testIndex() содержат преобразование json в java объекты.
В тесте testIndex() тестируется метод получения всех объектов, это достигается за счёт сравнения двух списков - один получается из БД, а второй из контроллера.
Для сравнения списков объектов в классах доменных моделей необходимо реализовать методы equals() и hashCode().
Студенты забывают про эти методы и у них не работает сравнение, это заставляет их вспомнить что необходимо реализовывать equals() и hashCode().
Это хороший пример со сравнением двух списков объектов, т.к. подавляющее большинство студентов к концу курса так и не понимают зачем необходимо переопределять эти методы.

@s-chepurnov
Copy link

Актуальная версия тестов testIndex() в этом Pull Request:

    @Test
    public void testIndex() throws Exception {
        var response = mockMvc.perform(get("/api/posts").with(token))
                .andExpect(status().isOk())
                .andReturn()
                .getResponse();

        String body = response.getContentAsString();

        List<PostDTO> postDTOS = om.readValue(body, new TypeReference<>() {});

        List<Post> actual = postDTOS.stream().map(postMapper::map).toList();
        List<Post> expected = postRepository.findAll();

        Assertions.assertThat(actual).containsAll(expected);
    }

@funnyDevGirl funnyDevGirl marked this pull request as ready for review July 19, 2024 11:02

var actual = postCommentDTOS.stream().map(postCommentMapper::map).toList();
var expected = postCommentRepository.findAll();
Assertions.assertThat(actual).containsAll(expected);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давайте тут матчер поменяем на специальный для итерируемых объектов (списки, объекты) https://assertj.github.io/doc/#assertj-core-group-contains


var actual = postDTOS.stream().map(postMapper::map).toList();
var expected = postRepository.findAll();
Assertions.assertThat(actual).containsAll(expected);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

и тут

@funnyDevGirl
Copy link
Author

Malcom1986 Максим, добрый день! Скорректировала во всех тестовых классах. Прошу посмотреть.
Спасибо.

@fey fey requested a review from Malcom1986 July 29, 2024 15:45
@Malcom1986
Copy link
Contributor

Мержим, спасибо

@Malcom1986 Malcom1986 merged commit 520a36c into hexlet-components:main Aug 2, 2024
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants