어제 오늘 내일

[JUnit] assertThrows() – 예외 발생 여부 테스트 본문

IT/JUnit

[JUnit] assertThrows() – 예외 발생 여부 테스트

hi.anna 2026. 1. 6. 08:02

1. assertThrows() 메소드

assertThrows() 메소드는 JUnit에서 특정 코드 실행 시 예외가 발생하는지 여부를 검증하는 단정(Assertion) 메소드입니다.
예외가 발생해야 하는 상황을 테스트하거나, 비정상 동작을 방지하기 위한 방어 로직을 확인할 때 매우 유용합니다.

JUnit5의 대표적인 메소드 정의는 다음과 같습니다.

assertThrows(expectedType, executable);
assertThrows(expectedType, executable, message);
  • expectedType: 발생해야 하는 예외 클래스
  • executable: 예외 발생 여부를 검사할 실행 블록(람다식 사용)
  • message: 예외가 발생하지 않을 경우 출력할 메시지

 

2. 기본적인 assertThrows() 사용 예제

import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test;

public class ExceptionTest {

    @Test
    void testAssertThrows() {
        assertThrows(ArithmeticException.class, () -> {
            int result = 10 / 0;
        });
    }
}

코드 설명

  • 0으로 나누는 연산은 ArithmeticException을 발생시킵니다.
  • assertThrows()는 해당 예외가 발생하면 테스트를 통과합니다.

 

3. 예외 메시지까지 확인하는 예제

@Test
void testExceptionMessage() {
    Exception exception = assertThrows(IllegalArgumentException.class, () -> {
        throw new IllegalArgumentException("잘못된 입력입니다.");
    });

    assertEquals("잘못된 입력입니다.", exception.getMessage());
}

코드 설명

  • 발생한 예외 객체를 반환받아 메시지까지 정확히 검증할 수 있습니다.
  • 예외 메시지를 테스트하는 것은 API 사용자의 에러 파악을 돕는 데 매우 중요합니다.

 

4. 사용자 정의 예외를 사용하는 예제

class AgeException extends RuntimeException {
    AgeException(String message) {
        super(message);
    }
}

class UserService {
    void validateAge(int age) {
        if (age < 0) {
            throw new AgeException("나이는 음수일 수 없습니다.");
        }
    }
}

@Test
void testCustomException() {
    UserService service = new UserService();

    assertThrows(AgeException.class, () -> service.validateAge(-1));
}

코드 설명

  • 사용자 정의 예외 AgeException을 발생시키는 로직을 테스트합니다.
  • 예외 발생 조건이 정확히 동작하는지 검증할 수 있습니다.

 

5. 여러 조건을 검증해야 할 때의 패턴

@Test
void testMultiConditionException() {
    assertThrows(NumberFormatException.class, () -> Integer.parseInt("ABC"));
    assertThrows(NullPointerException.class, () -> {
        String s = null;
        s.length();
    });
}

코드 설명

  • 잘못된 숫자 변환, null 참조 등 다양한 예외 상황을 독립적으로 테스트할 수 있습니다.

 

6. assertThrows() 사용 시 주의할 점

6.1 예외가 발생해야 테스트가 성공합니다.

예외가 발생하지 않으면 테스트는 실패하므로 로직 흐름을 정확히 이해하고 작성해야 합니다.

6.2 예외 타입이 정확히 일치해야 합니다.

부모 타입(Exception.class)으로 테스트하면 지나치게 넓은 범위를 허용하므로
가능하면 정확한 예외 타입을 지정해야 합니다.

6.3 예외 발생 위치를 명확히 해야 합니다.

람다식 내부에서 발생하는 코드만 검증 가능합니다.
람다식 바깥에서 발생한 예외는 assertThrows()에 의해 처리되지 않습니다.

 

7. 정리

assertThrows() 메소드는 예외 발생 여부를 정확하게 검증할 수 있는 JUnit의 핵심 도구입니다.
비정상 입력 처리, 방어 코드 테스트, 사용자 정의 예외 검증 등 다양한 상황에서 사용되며,
정확한 예외 타입과 메시지까지 확인하면 더욱 안정적인 테스트를 구축할 수 있습니다.

 

 

반응형
Comments