2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

JUnit에서 예외를 테스트하는 방법은?

_____
Q1: JUnit에서 특정 메서드가 예외를 던지는지 테스트하고 싶습니다. 어떻게 할 수 있나요?

A1: JUnit 4에서는 @Test 애노테이션의 expected 속성을 사용해 예외를 검사할 수 있습니다.
```java
@Test(expected = NullPointerException.class)
public void testMethodThrowsException() {
// 예외를 던지는 코드
}
```
하지만 이 방법은 예외가 발생하는 위치를 정확히 검증하기 어렵습니다.

JUnit 5에서는 Assertions.assertThrows() 메서드를 사용하여 더 정확히 예외를 검증합니다.
```java
@Test
void testMethodThrowsException() {
assertThrows(NullPointerException.class, () -> {
// 예외를 던지는 코드
});
}
```

Q2: assertThrows를 사용했을 때 예외 메시지도 검증할 수 있나요?

A2: 네, assertThrows는 발생한 예외 객체를 반환하므로 메시지도 확인 가능합니다.
```java
@Test
void testExceptionMessage() {
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
// 예외 발생 코드
});
assertEquals("Invalid argument", exception.getMessage());
}
```

Q3: JUnit 4에서 try-catch로 예외를 테스트하는 방법도 있나요?

A3: 네, expected 속성 사용 대신 try-catch를 사용해 예외 내용을 확인할 수 있습니다.
```java
@Test
public void testExceptionWithTryCatch() {
try {
// 예외 발생시키는 코드
fail("예외가 발생해야 합니다.");
} catch (IllegalArgumentException e) {
assertEquals("Invalid argument", e.getMessage());
}
}
```
이 방법은 예외 후 추가 검증을 원할 때 유용합니다.
Q4: 예외가 발생하지 않으면 테스트 실패 처리하려면 어떻게 해야 하나요?

A4: assertThrows, expected 속성 사용 시 자동으로 처리됩니다. try-catch를 쓸 경우 fail() 메서드를 호출해 실패 처리합니다.
```java
try {
someMethod();
fail("예외가 발생해야 합니다."); // 예외가 발생하지 않은 경우 실패 처리
} catch (ExpectedExceptionType e) {
// 예외 발생 시 테스트 통과
}
```

Q5: 여러 예외 중 하나라도 발생하면 성공으로 보고 싶습니다. 어떻게 테스트할 수 있나요?

A5: assertThrows는 단일 예외 타입 검사에 최적화돼 있어 직접 여러 예외를 처리해야 합니다.
```java
@Test
void testSeveralExceptions() {
try {
methodUnderTest();
fail("예외가 발생해야 합니다.");
} catch (IllegalArgumentException | NullPointerException e) {
// 예외가 두 가지 중 하나라면 테스트 통과
}
}
```

Q6: 예외 발생 후 정상적인 추가 작업도 검증할 수 있나요?

A6: 네, assertThrows 내부에서 예외를 발생시키는 구문 외부에 후속 검증 코드를 작성할 수 있습니다.
```java
@Test
void testExceptionAndAfterFollowUp() {
Exception e = assertThrows(RuntimeException.class, () -> {
methodThatThrows();
});
assertTrue(e.getMessage().contains("expected error"));

// 예외 발생 후 상태나 동작 확인
assertEquals(expectedValue, actualValue);
}
```

요약:
- JUnit 4: @Test(expected=Exception.class), 직접 try-catch 사용 가능
- JUnit 5: Assertions.assertThrows가 권장, 예외 메시지 및 상세 검증 가능
- 예외 미발생 시에는 fail()을 호출해 실패 처리
- 필요 시 추가 후속 검증도 가능

이렇게 하면 JUnit에서 예외 상황을 효과적으로 테스트할 수 있습니다.
JUnit에서 예외를 테스트하는 방법은 여러 가지가 있으며, JUnit 버전과 상황에 따라 적합한 방식을 선택할 수 있습니다.

대표적으로 JUnit 4와 JUnit 5에서 주로 사용하는 방법을 중심으로 설명드리겠습니다.

1. @Test의 expected 속성 사용 (JUnit

4) JUnit 4에서는 @Test 어노테이션에 expected 속성을 지정하여 특정 예외가 발생하는지 검사할 수 있습니다.

이 방법은 가장 간단하지만, 예외가 발생하는 전체 범위에 대해 검증하기 때문에 예외가 발생하는 위치나 메시지까지 세밀하게 확인할 수는 없습니다.

```java @Test(expected = IllegalArgumentException.class) public void testException() { // 예외를 발생시키는 코드 myObject.methodThatThrowsException(); } ``` 이 코드는 IllegalArgumentException이 발생하지 않으면 테스트가 실패합니다.



2. try-catch 블록과 fail() 메서드 이용하기 (JUnit 4, 5 공통) 좀 더 세밀한 검증이 필요할 때, 예외가 발생하는 위치를 명확히 하고 메시지까지 확인하려면 try-catch 블록을 쓸 수 있습니다.

```java @Test public void testException() { try { myObject.methodThatThrowsException(); fail("예외가 발생해야 합니다.

"); } catch (IllegalArgumentException e) { assertEquals("잘못된 인자입니다.

", e.getMessage()); } } ``` 이 방법은 예외 객체를 캡쳐하여 메시지나 기타 속성을 직접 검증 가능하지만, 코드가 장황해지는 단점이 있습니다.



3. Assert.assertThrows 메서드 사용 (JUnit

5) JUnit 5부터는 assertThrows 메서드를 통해 보다 간단하고 명확하게 예외를 테스트할 수 있습니다.

```java @Test void testException() { IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () -> { myObject.methodThatThrowsException(); }); assertEquals("잘못된 인자입니다.

", thrown.getMessage()); } ``` 이 방법은 람다 표현식으로 예외 발생 코드를 전달하고, 발생한 예외 객체를 반환받아 메시지나 상태를 검증할 수 있어 매우 권장됩니다.



4. ExpectedException 규칙 사용 (JUnit

4) JUnit 4에서는 ExpectedException 규칙을 통해 예외 타입, 메시지를 더 유연하게 검증할 수도 있습니다.

```java @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testException() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("잘못된 인자입니다.

"); myObject.methodThatThrowsException(); } ``` 이 방법은 예외가 발생하기 전에 기대하는 예외와 메시지를 선언하고, 실제 예외가 발생하는지 확인하는 방식입니다.

--- - JUnit 4에서는 `@Test(expected=예외클래스.class)`를 간단히 쓸 수 있으나, 메시지 검증이 어렵고, 발생 위치를 정확히 특정하기 어려움 - 예외 메시지까지 검증하거나 특정 부분에서 발생했는지 확인하려면 try-catch + fail 또는 ExpectedException 규칙을 사용 - JUnit 5에서는 `assertThrows()`가 가장 직관적이고 강력하며, 예외 객체의 상세 정보도 확인 가능 따라서 테스트 환경에 맞춰 적절한 방식을 선택해 예외 테스트를 구현하는 것이 좋습니다.

작성자: 최다은 [비회원] | 작성일자: 1년 전 2025-05-26 02:50:41
조회수: 194 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.