JUnit에서 예외 메시지를 검증하는 방법은?
_____A1: JUnit 4에서는 `@Test(expected = Exception.class)`를 사용하거나 `ExpectedException` 룰을 사용할 수 있습니다. JUnit 5에서는 `assertThrows()` 메서드를 사용하여 특정 예외가 발생하는지 검증할 수 있습니다.
---
Q2: 예외 메시지까지 검증하려면 어떻게 해야 하나요?
A2: 예외 메시지를 검증하려면 JUnit 5에서 `assertThrows()`를 사용하여 발생한 예외 객체를 받고, 그 객체의 메시지를 직접 비교하면 됩니다.
예시 (JUnit 5):
```java
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
// 예외를 발생시키는 코드
methodThatThrows();
});
assertEquals("예상한 예외 메시지", exception.getMessage());
```
---
Q3: JUnit 4에서 예외 메시지까지 검사하는 방법은?
A3: JUnit 4에서는 `ExpectedException` 룰을 사용하여 예외 메시지를 검증할 수 있습니다. 다음은 사용 예시입니다:
```java
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void testExceptionMessage() {
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("예상한 예외 메시지");
methodThatThrows();
}
이 방법은 메시지에 지정한 문자열이 포함되는지만 검사합니다.
---
Q4: 예외 메시지의 일부분만 확인하고 싶다면?
A4: JUnit 5에서는 `assertTrue()`와 `contains()`를 사용해서 부분 문자열을 체크할 수 있습니다.
예:
```java
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
methodThatThrows();
});
assertTrue(exception.getMessage().contains("부분 메시지"));
```
JUnit 4의 `ExpectedException` 룰에서는 `expectMessage()`에 문자열을 넣으면 해당 문자열이 포함되어 있는지 검사합니다.
---
Q5: 예외 메시지를 정규식으로 검증할 수 있나요?
A5: JUnit 4의 `ExpectedException.expectMessage()`는 정규식을 지원합니다. 예:
```java
thrown.expectMessage(matchesPattern(".*expected pattern.*"));
```
JUnit 5에서는 직접 정규식 패턴과 `assertTrue()`를 함께 사용할 수 있습니다.
---
요약
- JUnit 5: `assertThrows()`로 예외를 받고 메시지를 `getMessage()`로 검사한다.
- JUnit 4: `ExpectedException` 룰의 `expectMessage()`로 메시지를 검증한다.
- 메시지 전체 또는 일부 검증 가능하며, 일부만 검증할 때는 contains나 정규식 활용 권장.
그 중에서도 예외 메시지까지 세밀하게 검증할 때 주로 사용하는 방법들을 소개하겠습니다.
1. `assertThrows` 메서드 사용 (JUnit
5) JUnit 5부터 도입된 `assertThrows` 메서드는 어떤 코드 블록에서 특정 예외가 발생하는지를 검증할 뿐만 아니라, 발생한 예외 객체를 반환하기 때문에 메시지도 함께 검사할 수 있습니다.
```java import static org.junit.jupiter.api.Assertions.*; @Test void testExceptionMessage() { Exception exception = assertThrows(IllegalArgumentException.class, () -> { // 예외 발생시키는 코드 throw new IllegalArgumentException("잘못된 인자입니다.
"); }); // 메시지 검증 assertEquals("잘못된 인자입니다.
", exception.getMessage()); } ``` - `assertThrows`는 첫 번째 인자로 기대하는 예외 클래스를 받고, 두 번째 인자로 예외를 발생시킬 람다(또는 익명 함수)를 받습니다.
- 반환되는 예외 인스턴스에서 `getMessage()`를 호출해 실제 예외 메시지를 얻습니다.
- `assertEquals` 등으로 메시지 내용을 비교해 정확한 메시지가 맞는지 테스트할 수 있습니다.
2. JUnit 4 스타일의 `ExpectedException` 규칙 사용 JUnit 4 환경에서는 `@Rule` 어노테이션과 함께 `ExpectedException` 클래스를 이용할 수 있습니다.
메시지를 포함한 예외 조건을 미리 선언하는 방식입니다.
```java import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; public class ExceptionTest { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testExceptionMessage() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("잘못된 인자입니다.
"); // 예외 발생 코드 throw new IllegalArgumentException("잘못된 인자입니다.
"); } } ``` - `thrown.expect`로 예외 클래스를 지정하고, - `thrown.expectMessage`로 메시지 문자열을 지정하면, - 테스트 도중 예외가 발생하면서 메시지가 기대한 것과 다르면 실패합니다.
3. try-catch 블록과 직접 메시지 비교 위 두 가지 방식이 아닌 가장 기본적인 방식으로, `try-catch`를 이용해 수동으로 예외를 잡고 메시지를 검증할 수도 있습니다.
```java @Test void testExceptionMessage() { try { // 예외 발생 코드 throw new IllegalArgumentException("잘못된 인자입니다.
"); fail("예외가 발생하지 않았습니다.
"); } catch (IllegalArgumentException e) { assertEquals("잘못된 인자입니다.
", e.getMessage()); } } ``` - 예외가 발생해야 할 코드 실행 후 `fail()`을 호출해서 실패를 명시합니다.
- 예외를 잡으면 메시지를 직접 확인해 검증합니다.
- 다소 번거롭지만 모든 JUnit 버전에서 사용할 수 있습니다.
--- 요약 - JUnit 5에서는 `assertThrows`를 쓰고, 반환된 예외 객체의 `getMessage()`를 이용해 메시지를 검증한다.
- JUnit 4에서는 `ExpectedException` 룰을 써서 예외 타입과 메시지를 선언적으로 기대할 수 있다.
- 두 방법이 어렵거나 불가능하면 try-catch 블록으로 예외 메시지를 직접 비교할 수도 있다.
이렇듯 적절한 방식으로 예외 메시지까지 구체적으로 검증하면서 안정적인 테스트를 작성할 수 있습니다.
작성자:
정윤지 [비회원]
| 작성일자: 1년 전
2025-05-26 02:51:29
조회수: 177 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 177 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.