반응형
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);
}
예외 테스트 케이스를 작성할 때 중요한 점
경계값 테스트를 해야 한다.
- 범위(이상/이하/초과/미만), 구간, 날짜 등
참고
반응형
'Test Code' 카테고리의 다른 글
[참고 글] Test Double (0) | 2024.05.17 |
---|---|
[JUnit5] @Mock 필드 초기화 시점에 따른 @BeforeAll 이슈 (@BeforeEach, 테스트코드의 라이프 사이클) (1) | 2024.04.07 |
[테스트 코드] Controller Test Code / @WebMvcTest / 행위 검증 (0) | 2024.02.12 |