티스토리 뷰
일단은
생성 성공 테스트부터
초안
@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