코드 그라데이션

230217 BoardServiceImpl 테스트 코드 (3) 게시글 조회 본문

Spring/Test Code

230217 BoardServiceImpl 테스트 코드 (3) 게시글 조회

완벽한 장면 2023. 2. 27. 23:54

초안

@Test
  @DisplayName("게시글 목록 불러오기 테스트")
  void getBoards() {
    // given
    Pageable pageable = mock(Pageable.class);
    PageDto pageDto = mock(PageDto.class);

    when(pageDto.toPageable()).thenReturn(pageable);
    when(boardRepository.findAll(pageable)).thenReturn(Page.empty());

    // when
    Page<PagingBoardResponse> pagingProductResponse = boardService.getBoards(pageDto);

    // then
    assertThat(pagingProductResponse).isNotNull();
  }

  @Test
  @DisplayName("게시글 단건 조회 테스트")
  void getBoard() {
    // given
    BoardRequestDto boardRequest = mock(BoardRequestDto.class);
    Board board = mock(Board.class);

    when(boardRepository.findById(board.getId())).thenReturn(Optional.of(board));

    // when
    BoardResponseDto boardResponse = boardService.getBoard(board.getId());

    // then
    assertThat(boardResponse.getContent()).isEqualTo(boardRequest.getContent());
  }

 


부연설명

Pageable은 여러 페이지의 값들이 있을 때, 내가 원하는 부분만 추려서 가져오고 싶을 때 사용.

서비스단을 보면, 이것은 boardRepository를 조회하는 게 사실상 코드의 전부잖아요.
그래서 테스트가 좀 애매한 코드이긴 한데,
일단 서비스임플에서 응답이 map(PagingBoardResponse::new) 가 만들어졌는지는 확인이 가능하니까.

전체조회는 기존 코드면 충분.

단건조회 역시 boardRepository에서 아이디를 찾으면, 목킹한 보드를 반환하라고 주입을 해놓은 거고.
Response에 들어온 값과, Request에서 보낸 값이 일치하는지를 판단하는지를 검사해서 결과로 내놓으면 된다.

mocking을 하면 값이 어떻게 채워지는지를 확인해봐야 하는데 그렇게 하기가 쉽지 않으니 mock을 하지 말고 
값을 직접 채우자

 @Test
  @DisplayName("게시글 단건 조회 테스트")
  void getBoard() {
    // given
//    BoardRequestDto boardRequest = mock(BoardRequestDto.class); 이거 말고
// Board에 있는 값이 Dto로 잘 갔는지를 확인해야 하니까.
// 지금 서비스단 코드를 보면, board, response, request는 중요한 정보다.
    Board board = Board.builder()
            .title("test-title")
            .content("test-content")
            .build(); // 정보 일부만 확인하면 될 것이니까.

    when(boardRepository.findById(board.getId())).thenReturn(Optional.of(board));

    // when
    BoardResponseDto boardResponse = boardService.getBoard(board.getId());

    // then
    assertThat(boardResponse.getContent()).isEqualTo(board.getContent()); //request를.. 조회할 때 넘겨주지 않으니까, 그냥 board.getContent로 바꿨다.
    assertThat(boardResponse.getTitle()).isEqualTo(board.getTitle());
  }

완성된 코드

  @Test
  @DisplayName("게시글 목록 불러오기 테스트")
  void getBoards() {
    // given
    Pageable pageable = mock(Pageable.class);
    PageDto pageDto = mock(PageDto.class);

    when(pageDto.toPageable()).thenReturn(pageable);
    when(boardRepository.findAll(pageable)).thenReturn(Page.empty());

    // when
    Page<PagingBoardResponse> pagingProductResponse = boardService.getBoards(pageDto);

    // then
    assertThat(pagingProductResponse).isNotNull();
  }

  @Test
  @DisplayName("게시글 단건 조회 테스트")
  void getBoard() {
    // given
//    BoardRequestDto boardRequest = mock(BoardRequestDto.class);
    Board board = Board.builder()
            .title("test-title")
            .content("test-content")
            .build();

    when(boardRepository.findById(board.getId())).thenReturn(Optional.of(board));

    // when
    BoardResponseDto boardResponse = boardService.getBoard(board.getId());

    // then
    assertThat(boardResponse.getContent()).isEqualTo(board.getContent());
    assertThat(boardResponse.getTitle()).isEqualTo(board.getTitle());
  }
728x90
Comments