어제 오늘 내일

[JUnit5] BeforeEachCallback.beforeEach() 실행 흐름 이해 본문

IT/JUnit

[JUnit5] BeforeEachCallback.beforeEach() 실행 흐름 이해

hi.anna 2026. 1. 24. 01:16

1. BeforeEachCallback.beforeEach()란 무엇인가

BeforeEachCallback은 JUnit5 확장 모델(Extension API)의 대표적인 콜백 인터페이스 중 하나이며,
beforeEach(ExtensionContext context) 메서드는 각 테스트 메서드 실행 직전에 호출되는 확장 포인트다.

기본 어노테이션인 @BeforeEach와 달리, 확장을 통해 테스트 외부에서 공통 동작을 주입할 수 있다는 점이 핵심이다.
로깅, 테스트 데이터 초기화, 환경 설정, Mock 세팅 등 다양한 작업을 확장으로 구현할 수 있다.

 

2. 기본 구현 예제

import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;

public class LoggingExtension implements BeforeEachCallback {

    @Override
    public void beforeEach(ExtensionContext context) {
        System.out.println("[BeforeEachCallback] 실행 준비: " +
                context.getRequiredTestMethod().getName());
    }
}

설명

  • context를 통해 현재 테스트 클래스, 테스트 메서드, 애노테이션 등의 정보를 조회할 수 있다.
  • 실행 전 준비 작업을 넣을 수 있다.

 

3. 확장 적용 방법 – @ExtendWith 사용

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(LoggingExtension.class)
class ExtensionTest {

    @Test
    void testOne() {}

    @Test
    void testTwo() {}
}

실행 흐름 출력 예:

[BeforeEachCallback] 실행 준비: testOne
[BeforeEachCallback] 실행 준비: testTwo

 

4. 실제 실행 흐름 이해하기

JUnit5는 테스트를 실행할 때 다음 순서로 BeforeEach 관련 요소를 호출한다.

1) 확장(Extension)의 BeforeEachCallback.beforeEach()
2) 테스트 클래스의 @BeforeEach 메서드
3) 테스트 메서드(@Test)

즉, 확장이 먼저, @BeforeEach가 그 다음이다.

이를 통해 다음과 같은 구조를 만들 수 있다.

  • 확장에서 공통 설정 또는 환경 준비 수행
  • 각 테스트 클래스에서 개별 테스트 준비 작업 수행
  • 이후 실제 테스트 실행

 

5. 실행 순서 확인 예제

public class FlowExtension implements BeforeEachCallback {

    @Override
    public void beforeEach(ExtensionContext context) {
        System.out.println(">> 확장 BeforeEachCallback 실행");
    }
}
@ExtendWith(FlowExtension.class)
class FlowTest {

    @BeforeEach
    void setup() {
        System.out.println(">> @BeforeEach 실행");
    }

    @Test
    void sampleTest() {
        System.out.println(">> 테스트 실행");
    }
}

결과:

>> 확장 BeforeEachCallback 실행
>> @BeforeEach 실행
>> 테스트 실행

 

6. ExtensionContext에서 얻을 수 있는 주요 정보

beforeEach() 안에서 제공되는 ExtensionContext는 매우 강력한 메타데이터 조회 도구이다.

예를 들어:

@Override
public void beforeEach(ExtensionContext context) {
    String className = context.getRequiredTestClass().getSimpleName();
    String methodName = context.getRequiredTestMethod().getName();

    System.out.println("실행 클래스: " + className);
    System.out.println("실행 메서드: " + methodName);
}

활용 가능 정보

  • 테스트 클래스 정보
  • 테스트 메서드 정보
  • 디스플레이 네임
  • 태그 정보
  • 스토어(Store)에 데이터를 저장하여 테스트 간 공유 가능

 

7. BeforeEachCallback가 유용한 상황

  • 테스트 실행 전마다 공통 초기화 로직을 삽입해야 할 때
  • 여러 테스트 클래스에 반복되는 설정을 확장으로 통합하고 싶을 때
  • 로깅, 타이머, 리소스 준비 등을 자동으로 적용하려고 할 때
  • 테스트 프레임워크/도구와의 연동 지점을 만들고 싶을 때

특히 팀 단위에서 일관된 테스트 환경 구축이 필요할 때 크게 효과를 발휘한다.

 

반응형
Comments