코드 그라데이션

230217 BoardServiceImpl 테스트 코드 (1) 게시글 생성 - 비교 본문

Spring/Test Code

230217 BoardServiceImpl 테스트 코드 (1) 게시글 생성 - 비교

완벽한 장면 2023. 2. 26. 01:59

일단은

생성 성공 테스트부터

초안

@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
Comments