JUnit 5에서 @ExtendWith 애너테이션의 용도는?
_____A: `@ExtendWith`는 JUnit 5에서 테스트 클래스나 테스트 메서드에 확장(Extension)을 등록하기 위한 애너테이션입니다. 확장이란 테스트 실행 흐름을 조작하거나 추가 기능(예: 의존성 주입, 조건부 테스트 실행, 초기화 및 정리 작업 등)을 제공하는 모듈을 의미합니다.
---
Q: `@ExtendWith`를 사용하는 목적은 무엇인가요?
A: JUnit 5는 확장 모델을 통해 테스트 실행 시 특정 기능을 추가하거나 변경할 수 있도록 지원합니다. `@ExtendWith`는 이러한 확장 기능을 선언적으로 테스트 코드에 연결하여 다음과 같은 기능을 수행하게 합니다.
- 사용자 정의 확장 등록
- 타사 도구와의 연동(예: MockitoExtension, SpringExtension 등)
- 테스트 생명주기 훅(Custom Before/After 처리) 추가
- 테스트 조건 제어 (조건부 실행, 반복 테스트 제어 등)
- 테스트 실행환경 셋업 및 초기화 지원
---
Q: `@ExtendWith` 사용법은 어떻게 되나요?
A: `@ExtendWith`는 클래스나 메서드에 붙일 수 있으며, 확장 클래스 타입을 인자로 받습니다.
```java
@ExtendWith(MyCustomExtension.class)
class MyTest {
@Test
void myTestMethod() {
// 테스트 코드
}
```
- 여러 확장을 등록할 경우 배열 형태로 나열할 수 있습니다.
```java
@ExtendWith({ExtensionA.class, ExtensionB.class})
class MyTest { ... }
```
---
Q: 기존 JUnit 4의 `@RunWith`와 `@Rule`과 어떻게 다른가요?
A: JUnit 4 대신 JUnit 5는 확장(Extension) 모델을 채택하면서 `@RunWith`와 `@Rule`을 대체했습니다.
- `@RunWith`는 테스트 실행 방식을 결정하는 데 국한되었으나, `@ExtendWith`는 다양한 시점에 여러 기능을 끼워넣을 수 있는 더 유연한 구조입니다.
- 여러 확장을 조합해서 사용할 수 있어 기능 확장이 훨씬 간편하고 강력합니다.
---
Q: 대표적인 JUnit 5 확장 예시는 무엇인가요?
- Mockito 확장을 통한 Mock 객체 자동 주입: `@ExtendWith(MockitoExtension.class)`
- Spring Test와의 연동: `@ExtendWith(SpringExtension.class)`
- 커스텀 테스트 조건 적용을 위한 사용자 정의 확장 등
---
요약:
JUnit 5의 `@ExtendWith`는 테스트 클래스나 메서드에 확장(Extension)을 연결하는 애너테이션으로, 테스트 실행 시 추가 동작을 가능하게 하여 유연한 테스트 환경 구성과 기능 확장을 지원합니다.
JUnit 5는 확장 모델(Extension Model)을 도입하여 테스트 실행 과정 중에 특정 기능을 삽입하거나 테스트 환경을 커스터마이징할 수 있도록 설계되었는데, `@ExtendWith`가 바로 이 확장 기능을 활성화하는 역할을 합니다.
주요 역할과 용도 1. 확장 등록 `@ExtendWith`는 JUnit 5의 확장 인터페이스(예: `BeforeEachCallback`, `AfterEachCallback`, `TestExecutionExceptionHandler`, `ParameterResolver` 등)를 구현한 클래스를 테스트에 연결합니다.
이를 통해 테스트 실행 전후에 특정 로직을 실행하거나, 테스트 메서드에 파라미터를 주입하는 등의 동작을 수행할 수 있습니다.
2. 테스트 실행 환경 커스터마이징 확장을 통해 테스트의 실행 방식이나 결과 확인 방식을 변경할 수 있습니다.
예를 들어, 테스트 시작 전 초기화 작업을 수행하거나, 테스트 실패 시 추가 로깅을 한다거나, 특정 조건에서만 테스트를 실행하도록 하는 등 유연한 제어가 가능합니다.
3. 내장 및 외부 확장 기능 적용 JUnit 5에서는 자체적으로 제공하는 확장 기능뿐 아니라, 서드파티 라이브러리에서 제공하는 확장 기능을 `@ExtendWith`로 붙여 사용할 수 있습니다.
예를 들어, Mockito의 `MockitoExtension`이나 Spring의 `SpringExtension` 등을 테스트 클래스에 적용하여 Mockito 모ocking 기능이나 Spring 컨텍스트 관리를 자동으로 수행하게 만들 수 있습니다.
4. 메타 애너테이션으로 활용 가능 개발자는 `@ExtendWith`를 포함한 커스텀 애너테이션을 만들어, 여러 확장을 한꺼번에 재사용할 수 있습니다.
예를 들어 여러 확장을 묶어 새로운 테스트 설정 애너테이션을 정의할 때 유용합니다.
사용 예시 ```java @ExtendWith(MockitoExtension.class) class MyServiceTest { @Mock private Dependency dependency; @InjectMocks private MyService myService; @Test void testServiceMethod() { // 테스트 코드 } } ``` 위 예제에서 `@ExtendWith(MockitoExtension.class)`는 Mockito의 확장 기능을 테스트에 등록하여 `@Mock`, `@InjectMocks` 애너테이션이 제대로 동작하도록 돕습니다.
--- JUnit 5의 `@ExtendWith` 애너테이션은 테스트의 실행 과정에 특정 확장 기능을 연결해서 테스트 환경을 확장하고 커스터마이즈하는 데 사용되는 핵심 애너테이션입니다.
다양한 확장 포인트에 원하는 기능을 삽입할 때 반드시 쓰이는 방법이며, 이를 통해 보다 유연하고 강력한 테스트를 작성할 수 있습니다.
작성자:
최하은 [비회원]
| 작성일자: 1년 전
2025-05-26 02:50:44
조회수: 274 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 274 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.