봄날의 로그

[JUnit5] assertThrows 예외 테스트 본문

JUnit5

[JUnit5] assertThrows 예외 테스트

호잇호잇의 봄날들 2024. 12. 16. 14:35

 

assertThrows는 JUnit 5에서 예외를 테스트하는 표준 방식으로, 기존의 try-catch 방식보다 더 간결하고 효과적이다.

try-catch 구문대신 assertThrows 를 사용해보자

  -> @Test(expected = IllegalStateException.class)는 Junit5부터 사용되지 않음

 

1. 메서드 시그니처

assertThrows(Class<T> expectedType, Executable executable, String message);
 
  • expectedType: 발생할 것으로 예상되는 예외의 클래스 타입입니다.
    • 여기서는 IllegalStateException.class를 전달하여 이 타입의 예외가 발생해야 함을 나타냅니다.
  • executable: 예외가 발생할 것으로 예상되는 실행 가능한 코드 블록입니다.
    • 람다 표현식(() -> { ... })으로 작성하며, 예외를 던지는 코드만 포함합니다.
  • message: 테스트 실패 시 표시될 메시지(선택적).
    • 예외가 발생하지 않거나 타입이 예상과 다를 경우 출력됩니다.
    •  

2. 동작 원리

assertThrows는 내부적으로 다음과 같은 절차를 거칩니다:

  1. executable 블록을 실행합니다.
  2. 실행 중 expectedType으로 전달된 예외가 발생하면, 성공으로 간주합니다.
  3. 만약 예외가 발생하지 않거나 예상한 타입의 예외가 아니면, 테스트는 실패하며 message가 출력됩니다.

 

assertThrows(IllegalStateException.class, () -> {
    memberService.join(member2);
}, "예외가 발생해야 합니다.");

(1) IllegalStateException.class

  • 여기서 예상된 예외 타입은 IllegalStateException입니다.
  • memberService.join(member2) 호출 시 IllegalStateException이 발생하지 않으면 테스트는 실패합니다.

(2) () -> { memberService.join(member2); }

  • 람다 표현식으로 실행할 코드를 전달합니다.
  • 이 블록은 예외 발생 여부를 확인하기 위한 코드만 포함해야 하며, 불필요한 코드는 피해야 합니다.

(3) "예외가 발생해야 합니다."

  • 이 메시지는 테스트가 실패할 경우 출력됩니다.
  • 예를 들어, memberService.join(member2)가 예외를 던지지 않는다면 다음과 같은 메시지가 출력됩니다
org.opentest4j.AssertionFailedError: 예외가 발생해야 합니다.