어제 오늘 내일

[JUnit5] AfterEachCallback.afterEach() 실행 흐름 정리 본문

IT/JUnit

[JUnit5] AfterEachCallback.afterEach() 실행 흐름 정리

hi.anna 2026. 1. 24. 08:17

1. AfterEachCallback.afterEach()란 무엇인가

AfterEachCallback은 JUnit5의 확장 모델(Extension API)이 제공하는 콜백 인터페이스 중 하나로,
afterEach(ExtensionContext context) 메서드는 각 테스트 메서드 실행이 끝난 직후 호출되는 확장 포인트이다.

이는 @AfterEach와 유사하지만, 확장(Extension)을 통해 테스트 외부에서 공통 정리 로직을 강제하거나 자동화할 수 있다는 점에서 더 강력하다.
예: 리소스 해제, 트랜잭션 처리, 로그 수집, 타이머 종료, 모니터링 훅 등.

 

2. 기본 구현 예제

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

public class CleanupExtension implements AfterEachCallback {

    @Override
    public void afterEach(ExtensionContext context) {
        System.out.println("[AfterEachCallback] 테스트 종료: " +
                context.getRequiredTestMethod().getName());
    }
}

설명

  • 테스트가 정상/실패 여부와 관계없이 테스트가 끝나는 시점에 호출된다.
  • ExtensionContext를 통해 테스트 메타데이터에 접근할 수 있다.

 

3. 확장 적용 – @ExtendWith

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

@ExtendWith(CleanupExtension.class)
class ExtensionTest {

    @Test
    void testOne() {}

    @Test
    void testTwo() {}
}

출력 예:

[AfterEachCallback] 테스트 종료: testOne
[AfterEachCallback] 테스트 종료: testTwo

 

 

4. 전체 실행 흐름 이해하기

AfterEachCallback는 다음 순서로 실행된다.

1) 테스트 메서드(@Test) 실행
2) 테스트 메서드 종료
3) @AfterEach 메서드 실행
4) AfterEachCallback.afterEach() 실행 (확장이 마지막에 실행됨)

즉, 확장(Extension)의 AfterEach는 항상 테스트 메서드와 @AfterEach 뒤에 실행된다.

이를 통해 다음과 같은 정리 패턴을 만들 수 있다.

  • @AfterEach는 개별 클래스 수준 정리
  • AfterEachCallback은 프로젝트 전역 또는 프레임워크 확장 수준 정리

 

5. 실행 순서 확인 예제

public class FlowExtension implements AfterEachCallback {

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

    @AfterEach
    void teardown() {
        System.out.println(">> @AfterEach 실행");
    }

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

결과 출력:

>> 테스트 실행
>> @AfterEach 실행
>> 확장 AfterEachCallback 실행

 

 

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

AfterEachCallback에서도 TestInfo와 유사한 테스트 메타데이터 조회가 가능하다.

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

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

활용 가능 정보

  • 테스트 메서드 이름
  • 테스트 클래스 정보
  • 태그 정보
  • 테스트 디스플레이 네임
  • 스토어(Store)에 저장된 데이터 읽기/삭제

 

7. AfterEachCallback가 유용한 상황

  • 테스트 후 리소스를 자동 정리해야 할 때
  • DB 연결/세션/파일 핸들 등을 안전하게 종료해야 할 때
  • 테스트 실행 로그 및 결과를 일관적으로 수집할 때
  • 외부 모니터링 도구와 연동해야 할 때
  • 타이머, StopWatch 등을 후처리해야 할 때

특히 여러 테스트 클래스에서 공통적으로 필요한 정리 로직을 확장 하나로 통합할 수 있어 유지보수가 크게 쉬워진다.

 

 

반응형
Comments