빙응의 공부 블로그

[Spring]단위 테스트 정리하기 JUnit(1/3) 본문

Spring/개인공부_이론

[Spring]단위 테스트 정리하기 JUnit(1/3)

빙응이 2024. 10. 18. 13:45

단위 테스트에 대해 다 까먹어서 다시 복습하는 겸 작성해보자 

📝JUnit5

JUnit5는 자바 단위 테스트를 위한 테스트 프레임워크이다.
여기에 더해 AssertJ도 함께 사용하여 스프링에서 편하게 테스트가 가능하다.

 

📌AssertJ ??

// AssertJ를 사용한 Assertion
assertThat(actualValue).isEqualTo("hello")

AssertJ는 위 코드처럼 간단하고 가독성 좋은 코드를 지원한다.

 

📌[given/when/then 패턴]

  • 요즘 단위테스트는 거의 given-when-then 패턴으로 작성하는 추세이다.
  • 이 것은 단위 테스트를 3가지 단계로 나누어 처리하는 것으로 가독성을 향상시켜준다.
    • given(준비): 어떠한 데이터가 준비되었을 때
    • when(실행): 어떠한 함수를 실행하면
    • then(검증): 어떠한 결과가 나와야 한다.

📝단위 테스트 작성하기 

게시물 생성 코드

간단한 게시물 CRUD 코드로 테스트해보자 

@Service
@RequiredArgsConstructor
public class BoardService {
  private final BoardRepository boardRepository;


  public List<Board> getAllBoards() {
    return boardRepository.findAll();
  }

  public void createBoard(BoardFormDTO boardFormDTO) {
    Board board = new Board();
    board.setTitle(boardFormDTO.getTitle());
    board.setContent(boardFormDTO.getContent());
    boardRepository.save(board);
  }

  public Board updateBoard(Board board) {
    return boardRepository.save(board);
  }

  public void deleteBoard(Long id) {
    boardRepository.deleteById(id);
  }
}

 

게시물 전체 조회하기 

우선 조회 코드를 살펴보자

  • given 단계에서 테스트할 게시물을 저장해주었고
  • when 단계에서 조회를 해주었다.
  • then 단계에서 사이즈와 타이틀을 통해 검사를 진행했다. 
    @Test
    void getAllBoards_ShouldReturnAllBoards() {
        // given
        boardRepository.save(new Board("Title 1", "Content 1"));
        boardRepository.save(new Board("Title 2", "Content 2"));

        // when
        List<Board> boards = boardService.getAllBoards();

        // then
        assertThat(boards).hasSize(2);
        assertThat(boards.get(0).getTitle()).isEqualTo("Title 1");
        assertThat(boards.get(1).getTitle()).isEqualTo("Title 2");
    }

 

게시물 생성하기
  • given 단계에서 when 단계 로직에 들어갈 DTO를 정의해줬다.
  • when 단계에서 게시물을 생성해주고
  • then 단계에서 검증해주었다.
    @Test
    void createBoard_ShouldSaveNewBoard() {
        // given
        BoardFormDTO dto = new BoardFormDTO();
        dto.setTitle("New Title");
        dto.setContent("New Content");

        // when
        boardService.createBoard(dto);

        // then
        List<Board> boards = boardRepository.findAll();
        assertThat(boards).hasSize(1);
        assertThat(boards.get(0).getTitle()).isEqualTo("New Title");
        assertThat(boards.get(0).getContent()).isEqualTo("New Content");
    }

 

나머지

모두 비슷한 맥락으로 진행하는 것을 알 수 있다.

    void updateBoard_ShouldUpdateExistingBoard() {
        // given
        Board board = new Board("Old Title", "Old Content");
        boardRepository.save(board);

        // when
        board.setTitle("Updated Title");
        board.setContent("Updated Content");
        Board updatedBoard = boardService.updateBoard(board);

        // then
        assertThat(updatedBoard.getTitle()).isEqualTo("Updated Title");
        assertThat(updatedBoard.getContent()).isEqualTo("Updated Content");
    }

    @Test
    void deleteBoard_ShouldRemoveBoard() {
        // given
        Board board = new Board("Title", "Content");
        boardRepository.save(board);
        Long boardId = board.getId();

        // when
        boardService.deleteBoard(boardId);

        // then
        assertThat(boardRepository.findById(boardId)).isNotPresent();
    }