개발 낙서장

[TIL] 내일배움캠프 40일차 - Service 테스트 본문

Java/Sparta

[TIL] 내일배움캠프 40일차 - Service 테스트

권승준 2024. 2. 22. 00:00

 

 

오늘의 학습 키워드📚

BDDMockito를 활용한 Service 테스트

테스트 코드는 기본적으로 Given, When, Then 구조로 이루어져있다.

Given은 테스트를 준비하는 과정으로 데이터의 변수를 설정한다거나 데이터를 추가하는 등의 작업을 수행한다.
When은 실제로 테스트를 진행하는 과정이다.
Then은 예상한 결과와 실제 테스트 값을 비교하는 과정이다.

TodoCard 글을 작성하는 createCard라는 메소드가 Service에 있다고 하면 테스트 코드는 다음과 같이 작성하면 된다.

    @Test
    @DisplayName("Create Card")
    void createCard() {
        // given
        User user = new User("abc123", "abc12345", UserRoleEnum.USER);
        String cardname = "카드 이름";
        String content = "카드 내용";
        TodoCardRequestDto requestDto = TodoCardRequestDto.builder().cardname(cardname)
            .content(content).build();

        // when
        TodoCardResponseDto responseDto = todoCardService.createCard(requestDto, user);

        // then
        assertNotNull(responseDto);
        assertEquals(cardname, responseDto.getCardname());
        assertEquals(content, responseDto.getContent());
    }

이 곳에는 딱히 서비스 로직이 들어가있지 않아서 그냥 생성하고 테스트를 진행하면 된다.
User를 생성하고 createCard를 통해 카드를 생성해 나온 값을 생성할 때의 값과 비교해서 정상적으로 생성이 되는지를 테스트하는 것이다.

BDDMockito에서는 given이라는 메소드를 통해 given 부분의 처리를 가독성 좋게 해결할 수 있다.

카드의 내용을 수정하는 로직의 테스트 코드를 작성하려면 카드를 생성하고 테스트용 DB에 저장을 한 다음에 ID로 저장된 카드를 찾아서 수정을 하고 비교를 해야 한다.
하지만 given을 사용하면 DB에 저장을 하는 과정을 거치지 않고 ID로 찾았을 때 해당 카드가 나오도록 테스트 코드를 작성할 수 있다.

    @Test
    @DisplayName("Update Card")
    void updateCard() {
        // given
        Long userId = 100L;
        User user = new User("abc123", "abc12345", UserRoleEnum.USER);
        user.setId(userId);

        Long cardId = 100L;
        TodoCard todoCard = new TodoCard(TodoCardRequestDto.builder().cardname("카드 이름")
            .content("카드 내용").build(), user);
        todoCard.setId(cardId);

        given(todoCardRepository.findById(cardId)).willReturn(Optional.of(todoCard));

        String cardname = "카드 이름 수정";
        String content = "카드 내용 수정";

        // when
        TodoCardResponseDto responseDto = todoCardService.updateCard(cardId,
            TodoCardRequestDto.builder().cardname(cardname).content(content).build(), user);

        // then
        assertEquals(cardname, responseDto.getCardname());
        assertEquals(content, responseDto.getContent());
    }

오늘의 회고💬

테스트 코드라는게 작성할 수록 뭔가 어색해서 쉽지만은 않았던 것 같다.

 

내일의 계획📜

내일은 Controller 테스트까지 작성해서 과제를 완수해야겠다.

Comments