Java Spring 기반의 Test와 TDD
2023.05.16
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단계 : 확장
도메인 메서드로 분리하거나 중복 로직을 메서드화하며 리팩터링한다.
댓글을 작성해보세요.