코드 그라데이션
230217 BoardServiceImpl 테스트 코드 (1) 게시글 생성 - 비교 본문
일단은
생성 성공 테스트부터
초안
@ExtendWith(MockitoExtension.class)
class BoardServiceImplTest {
@Mock
BoardRepository boardRepository;
@InjectMocks
BoardServiceImpl boardService;
@Test
@DisplayName("게시글 생성 성공 테스트")
void createBoard() {
BoardRequestDto requestDto = BoardRequestDto.builder()
.title("title1")
.content("content1")
.build();
User user = mock(User.class);
//when
boardService.createBoard(requestDto, user);
//then
verify(boardRepository).save(isA(Board.class));
}
부연설명
일단
verify(boardRepository).save(isA(Board.class)); 이것은
boardRepository에서 save가 불릴 때, 보드타입이 들어왔는지를 묻는 것.
사실 검증하는 방법은 정말 다양한데,
이 메서드가 몇 번 불렸냐로도 확인해볼 수 있음.
그런데 이것도 리턴값이 처음에 메서드에서는 void라 확인할 방법이... 쉽지 않았음.
그래서 얘가 생성된 걸 그대로 돌려줘도 좋은 방법이 될 듯.
그럼 테스트가 더 쉬워지죠.
결과를 받아서 두 개 값이 똑같은지 확인하면 되니까.
public Board createBoard(BoardRequestDto boardRequestDto, User user) {
...
return boardRepository.save(board);
} 이렇게
그러면
@Test
@DisplayName("게시글 생성 성공 테스트")
void createBoard() {
BoardRequestDto requestDto = BoardRequestDto.builder()
.title("title1")
.content("content1")
.build();
User user = mock(User.class);
//when
// boardService.createBoard(requestDto, user);
=> 변경
Board board = boardService.createBoard(requestDto, user);
이거랑, 내가 위에서 빌더로 넣은 정보랑 똑같은지를 검사하면 되는 거예요.
//then
//주석처리 verify(boardRepository).save(isA(Board.class));
검사코드가 바로...
assertThat(savedBoard.getTitle()).isEqualTo(requestDto.getTitle());
assertThat(savedBoard.getContent()).isEqualTo(requestDto.getContent());
// 좀 더 직관적이 되었지.
}
BoardService 의 메서드도
Board createBoard(BoardRequestDto boardRequestDto, User user);
이렇게 수정... 그런데 역시 여기서도 에러?
지금 ServiceImpl에서는 그대로 저장된 값을 리턴해주는데 테스트 클래스에서는 단순이 @Mock으로 깡통만 만들어주고 끝났기 때문.
그래서 한 가지 작업 더 해주기.
작업 하나 더 추가, 실행단에!
"만약에 boardRepository에 save가 작동이 되면, [(any())는 아무것이나 상관없다는 뜻.] board를 돌려줄거야.
그럼 이 값이 수행되었을 때 그냥 깡통이 아니라 값을 주는 깡통이 된 것이지.
@Test
@DisplayName("게시글 생성 성공 테스트")
void createBoard() {
//given
// BoardRequestDto requestDto = BoardRequestDto.builder().title("title1").content("content1").build();
// 이것도 허접하므로 enum값까지 정석적으로 테스트해보자, 가져오는 법 알았잖아.
BoardRequestDto requestDto = BoardRequestDto.builder()
.title("title1")
.content("content1")
.subject(Board.BoardSubject.공지사항)
.build();
User user = mock(User.class);
//<추가하는 부분2> 아래 보면, 현재 board가 없으므로 board를 미리 만들어놓아야 되겠지.
Board board = Board.builder()
.title(requestDto.getTitle())
.content(requestDto.getContent())
.subject(Board.BoardSubject.공지사항)
.build();
// <추가하는 부분>
given(boardRepository.save(any())).willReturn(board);
//when
Board savedBoard = boardService.createBoard(requestDto, user);
// 실행 전에 먼저 수행되어야 정상작동하므로 추가하는 부분을 given부분에 넣어줘야겠지?
// 그리고 얘는 저장된 board로 비교가 확실히 되기 위해서 savedBoard로 명칭 바꿔줬어.
//then
assertThat(savedBoard.getTitle()).isEqualTo(requestDto.getTitle());
assertThat(savedBoard.getContent()).isEqualTo(requestDto.getContent());
}
* enum은 마치 static처럼 이름을 그대로 쓰고
enum클래스.넣고싶은 것
지금 여기서 Board.BoardSubject.공지사항 인 이유는
클래스 안의 클래스여서 그렇다.
그래서 최종 완성본
@ExtendWith(MockitoExtension.class)
class BoardServiceImplTest {
@Mock
BoardRepository boardRepository;
@InjectMocks
BoardServiceImpl boardService;
@Test
@DisplayName("게시글 생성 성공 테스트")
void createBoard() {
BoardRequestDto requestDto = BoardRequestDto.builder()
.title("title1")
.content("content1")
.subject(Board.BoardSubject.공지사항)
.build();
User user = mock(User.class);
Board board = Board.builder()
.title(requestDto.getTitle())
.content(requestDto.getContent())
.subject(Board.BoardSubject.공지사항)
.build();
given(boardRepository.save(any())).willReturn(board);
//when
Board savedBoard = boardService.createBoard(requestDto, user);
// then
assertThat(savedBoard.getTitle()).isEqualTo(requestDto.getTitle());
assertThat(savedBoard.getContent()).isEqualTo(requestDto.getContent());
}
}
-57분46초
728x90
'Spring > Test Code' 카테고리의 다른 글
230217 BoardServiceImpl 테스트 코드 (3) 게시글 조회 (0) | 2023.02.27 |
---|---|
230217 BoardServiceImpl 테스트 코드 (2) 게시글 수정 성공 / 실패 (0) | 2023.02.26 |
230217 Service단 TestCode 전후 비교 (0) | 2023.02.26 |
20230210 테스트 코드 추가 설명 (4) 프로필 정보 조회 실패 테스트 (0) | 2023.02.16 |
20230210 테스트 코드 추가 설명 (3) 프로필 정보 조회 성공 테스트 (0) | 2023.02.16 |
Comments