Java Spring 기반의 Test와 TDD

Test

  • 테스트는 항상 통과해야하며, 예외를 포함한 최대한 많은 케이스를 다룰수록 좋다.

  • 테스트 종류

    • Unit Test

      • 단위적인 기능을 개별적으로 테스트하는 것

      • Mock

        • 행위 검증; 메소드의 리턴 값으로 판단할 수 없는 경우, 특정 동작을 수행하는지 확인

      • Stub

        • 상태 검증; 객체의 상태를 확인하여 올바르게 동작했는지를 확인

      • Fake

        • 객체의 행위를 모킹하는 것이 아닌 객체자체를 모킹하는 방식

        • 인메모리DB, Map 더미 데이터 등을 사용

    • Integration Test

      • 상호의존적 환경 내에서 전반적인 흐름을 테스트

 

TDD 실습

  • 1단계 : 테스트 코드 작성 후 테스트 실행(실패)

    JPA Repository 또는 Fake Repository 생성

  • Test

    @ExtendWith(SpringExtension.class)
    class BoardServiceTest {
    
        @Mock BoardRepository boardRepository;
    
        @Test
        void boardSave(){
            // given
            long boardId = 1l;
            BoardRequestDto boardRequestDto = BoardRequestDto.builder().build();
    
            // when
            BoardService boardService = new BoardService();
            BoardResponseDto boardResponseDto = boardService.save(boardRequestDto);
            
            // then
            assertThat(boardId).isEqualTo(boardResponseDto.getBoardId());
        }
    
        class BoardService {
            BoardResponseDto save(BoardRequestDto boardRequestDto){
                return null;
            }
        }
    }


    BoardRequestDto 생성

    @Getter
    @Builder
    @NoArgsConstructor
    public class BoardRequestDto {
        private long writerId;
        private long categoryId;
        private String title;
        private String content;
    
    }



  • 2단계 : 비즈니스 로직 필요만큼 추가 후 테스트 실행(통과)

    Test

    @ExtendWith(SpringExtension.class)
    class BoardServiceTest {
    
        @Mock BoardRepository boardRepository;
    
        @Test
        void boardSave(){
            // given
            long boardId = 1l;
            BoardRequestDto boardRequestDto = BoardRequestDto.builder().build();
    
            // when
            BoardService boardService = new BoardService();
            BoardResponseDto boardResponseDto = boardService.save(boardRequestDto);
            
            // then
            assertThat(boardId).isEqualTo(boardResponseDto.getBoardId());
        }
    
        class BoardService {
            BoardResponseDto save(BoardRequestDto boardRequestDto){
                BoardEntity boardEntity = BoardEntity.builder()
                                                     .writerId(boardRequestDto.getWriterId())
                                                     .build();
                BoardEntity savedBoard = boardRepository.save(boardEntity);
                return new BoardResponseDto(savedBoard);
            }
        }
    }

     

     

  • 3단계 : 반복

    • categoryId 검증과 같은 필수 로직을 하나씩 추가하며 테스트를 반복한다.

  • 4단계 : 확장

    • 도메인 메서드로 분리하거나 중복 로직을 메서드화하며 리팩터링한다.





댓글을 작성해보세요.