뭉지(moonz)
작은 발자국들의 위대한 여정
뭉지(moonz)
  • All (202)
    • Test Code (4)
    • 백엔드 개발하며 작성한 (27)
      • Spring (17)
      • 데이터베이스 (7)
      • 기억할 내용 (3)
    • 언어 (53)
      • Java (25)
      • node.js (7)
      • Python (21)
    • 클라우드 (6)
    • Algorithm & Data Structure (51)
      • 개념 (15)
      • 문제 풀이 (36)
    • 유용한 모든 것 (16)
    • monologue (7)
      • 업무 노트 (1)
      • 관리 로그 (0)
      • 내 이야기 공책 (6)
    • Project (2)
    • TroubleShooting (8)
    • 지식 (18)
      • Machine Learning (6)
      • Review (7)
      • Web (5)
    • Computer Science (5)

블로그 메뉴

  • 홈
  • 태그

인기 글

최근 글

최근 댓글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
뭉지(moonz)

작은 발자국들의 위대한 여정

Test Code

[JUnit5] 실패 케이스 테스트하기

2024. 2. 24. 23:07
반응형

JUnit5를 이용해 예외 발생 케이스를 테스트하는 방법을 알아봅니다.

방법 1. assertThrows() 메서드 사용

Exception 발생 여부 확인과 Exception 메시지를 비교할 수 있습니다.

아래는 CafeKiosk 서비스 클래스의 add(~) 메서드에 0 혹은 음수를 전달했을 때 예외가 잘 발생하는지 확인하는 테스트 메서드입니다.

class CafeKioskTest {
    @Test
    @DisplayName("[FAILED] 음료 수량으로 음수, 0은 불가능하다.")
       void addWithCount() {
        // given
        CafeKiosk cafeKiosk = new CafeKiosk();
        // then
        Exception exception = assertThrows(OperationFailedException.class, () -> {
              operator.divide(3, 0);
          });
        assertEquals(exception.getMessage(), OPERATION_FAILED_ERROR.getMessage());
    }
}

org.assertj.core.api.Assertions 클래스의 assertThat()도 사용할 수 있습니다.

assertThat(exception.getMessage()).isEqualTo(OPERATION_FAILED_ERROR.getMessage());

방법 2. assertThatThrownBy 메서드 사용

org.assertj.core.api.Assertions 클래스의 assertThatThrownBy 메서드입니다.

class CafeKioskTest {
    @Test
    @DisplayName("[FAILED] 음료 수량으로 음수, 0은 불가능하다.")
    void addWithCount() {
        // given
        CafeKiosk cafeKiosk = new CafeKiosk();

        // when & then
        assertThatThrownBy(() -> cafeKiosk.add(new Americano(), 0))
                .isInstanceOf(IllegalArgumentException.class)
                .hasMessage("음료는 1잔부터 주문할 수 있습니다.");
    }
}

만약 Exception에 필드들이 있다면 이 필드들도 검증할 수 있습니다.

class NotFoundUserException extends RuntimeException {
    ErrorCode errorCode;

    public NotFoundUserException (ErrorCode errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
    }
}

아래와 같이 extracting()과 isEqualTo() 체이닝 메서드를 이용합니다.
UserService 클래스의 findUser() 메서드를 호출하면 NotFoundUserException 예외가 발생한다고 가정합시다.

  @Test
  void throw_CustomException() {
    assertThatThrownBy(() -> userService.findUser())
        .isInstanceOf(NotFoundUserException.class)
        .extracting("errorCode")
        .isEqualTo(ErrorCode.NOT_FOUND_USER);
  }

예외 테스트 케이스를 작성할 때 중요한 점

경계값 테스트를 해야 한다.

  • 범위(이상/이하/초과/미만), 구간, 날짜 등

참고

  • https://www.baeldung.com/junit-5
  • 인프런 "실용적인 테스트 가이드"
  • https://www.baeldung.com/assertj-exception-assertion
반응형
저작자표시 (새창열림)

'Test Code' 카테고리의 다른 글

[참고 글] Test Double  (0) 2024.05.17
[JUnit5] @Mock 필드 초기화 시점에 따른 @BeforeAll 이슈 (@BeforeEach, 테스트코드의 라이프 사이클)  (1) 2024.04.07
[테스트 코드] Controller Test Code / @WebMvcTest / 행위 검증  (0) 2024.02.12
    'Test Code' 카테고리의 다른 글
    • [참고 글] Test Double
    • [JUnit5] @Mock 필드 초기화 시점에 따른 @BeforeAll 이슈 (@BeforeEach, 테스트코드의 라이프 사이클)
    • [테스트 코드] Controller Test Code / @WebMvcTest / 행위 검증
    뭉지(moonz)
    뭉지(moonz)
    제가 깨달은 것을 정리하는 공간입니다. 🧡

    티스토리툴바