JUnit의 @ExtendWith와 @BeforeEach의 차이점은 무엇인가요?
_____- @ExtendWith: JUnit 5에서 확장(Extension)을 등록할 때 사용하는 어노테이션으로, 테스트 실행 시 특정 동작을 확장 기능으로 추가하고 싶을 때 붙입니다. 예를 들어, MockitoExtension, SpringExtension 등을 등록할 때 사용됩니다.
- @BeforeEach: 각 테스트 메서드가 실행되기 전에 매번 자동으로 호출되는 초기화 메서드를 표시하는 어노테이션입니다. 테스트 실행 전 공통 설정 작업에 사용됩니다.
---
Q2: @ExtendWith와 @BeforeEach의 용도는 어떻게 다른가요?
- @ExtendWith: JUnit 프레임워크에 기능을 확장하기 위한 과정이며, 테스트 실행 라이프사이클에서 추가 작업을 자동으로 처리하게 하는 메커니즘입니다.
- @BeforeEach: 테스트 메서드별로 공통적으로 필요한 초기화 코드를 직접 작성하고 실행하기 위한 훅(hook) 메서드 지정용입니다.
---
Q3: @ExtendWith가 적용되는 대상은 무엇인가요?
- 주로 클래스 레벨에서 사용하지만, 테스트 클래스나 테스트 메서드에도 적용할 수 있습니다. 확장(extension)이 테스트 전체 혹은 특정 테스트에 영향을 미치도록 지정합니다.
---
Q4: 테스트 실행 시 @BeforeEach는 언제 호출되나요?
- 각 테스트 메서드가 실행되기 직전에 한 번씩 호출됩니다. 즉, 한 클래스 내 여러 개의 테스트 메서드가 있다면, 각각 실행 전에 @BeforeEach 메서드가 반복 호출됩니다.
---
Q5: @ExtendWith는 테스트 실행 중 어떤 역할을 하나요?
- 테스트 라이프사이클에 개입해 추가 기능(예: 의존성 주입, Mockito mock 초기화, 트랜잭션 관리 등)을 자동으로 수행합니다. 사용자가 직접 호출하는 메서드가 아니라 JUnit이 확장 포인트에서 동작합니다.
---
Q6: @BeforeEach와 @ExtendWith의 공통점이 있나요?
- 둘 다 테스트 실행 과정에서 자동으로 호출되거나 적용된다는 점, 테스트 실행 전 특정 동작을 수행하는 데 사용된다는 점에서 관련이 있습니다. 하지만 역할과 적용 범위가 명확히 다릅니다.
Q7: 실용적인 예시를 들어주세요.
- @BeforeEach 예시:
```java
@BeforeEach
void setUp() {
database.clear();
database.insert(testData);
}
```
각 테스트 실행 전에 데이터베이스를 초기화합니다.
- @ExtendWith 예시:
```java
@ExtendWith(MockitoExtension.class)
class MyTest {
@Mock
Service service;
// Mockito가 자동으로 mock 초기화 및 주입 처리
}
```
---
요약:
- @ExtendWith: JUnit 자체의 확장 시스템에 확장 기능을 등록하는 어노테이션 (전반적인 테스트 실행 과정 확장).
- @BeforeEach: 각 테스트 메서드 실행 전에 매번 호출되는 초기화 메서드를 지정하는 어노테이션 (각 테스트 준비 작업).
따라서, @ExtendWith는 "테스트 실행 환경에 대한 확장/설정 등록"이고, @BeforeEach는 "테스트 실행 전 코드 실행 시점 지정"으로 구분할 수 있습니다.
1. @ExtendWith - 역할: JUnit 5에서 확장(Extension)을 적용하기 위해 사용하는 어노테이션입니다.
확장은 테스트 실행 시점에 동작하는 추가 기능을 삽입하는 메커니즘으로, 테스트 라이프사이클에 맞춰 훨씬 다양하고 복잡한 동작을 수행할 수 있게 해줍니다.
- 사용 사례: 예를 들어, MockitoExtension(@ExtendWith(MockitoExtension.class))를 달면 Mockito의 mock 초기화가 자동으로 이루어지며, SpringExtension을 달면 스프링의 테스트 컨텍스트가 연동됩니다.
- 특징: 하나 이상의 확장 클래스를 지정할 수 있고, 테스트 클래스 전체 혹은 개별 테스트 메소드에 적용할 수 있습니다.
확장 방식이므로 내부적으로는 테스트 실행 전후 특정 이벤트를 후킹하고 추가 작업을 수행합니다.
2. @BeforeEach - 역할: 테스트 메소드가 실행되기 직전에 호출되는 메소드를 지정하기 위한 어노테이션입니다.
즉, 테스트 전 초기화나 공통 설정 작업을 수행하는 용도입니다.
- 사용 사례: 테스트에서 공통으로 필요한 객체를 생성하거나 상태를 초기화할 때 사용합니다.
예를 들어 테스트용 데이터 초기화, mock 객체 초기화, 웹 드라이버 세팅 등 간단한 준비 작업을 여기에 작성합니다.
- 특징: 테스트 클래스 내에서 메소드에 붙이며, 각 테스트 메소드 실행 전에 반복적으로 호출됩니다.
단순히 메소드 실행 시점을 지정하는 것이고, 테스트 실행 자체를 확장하거나 제어하지는 않습니다.
@ExtendWith는 테스트 실행의 프로세스 자체에 후킹하여 확장기능을 추가하는 메커니즘으로, 보통 프레임워크나 라이브러리 차원에서 기능을 통합할 때 사용합니다.
@BeforeEach는 테스트 메소드 실행 전에 호출되는 초기화 루틴을 간단히 지정하는 용도로, 테스트 내부 상태 설정에 집중합니다.
따라서 둘은 목적과 적용범위가 다르며, 경우에 따라 함께 쓰이기도 합니다.
간단히 말해, @BeforeEach는 “이 테스트 시작 전에 이 메소드를 실행하라”는 사전 준비용이며, @ExtendWith는 “테스트 실행 절차를 확장하거나 바꾸는” 더 고수준의 기능 확장용입니다.
작성자:
박지우 [비회원]
| 작성일자: 1년 전
2025-05-26 02:51:31
조회수: 261 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 261 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.