반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- IntelliJ
- java테스트
- math
- Array
- junit5
- json
- 문자열
- 자바
- 인텔리제이
- Visual Studio Code
- ArrayList
- HashMap
- string
- 자바스크립트
- 테스트자동화
- 이클립스
- list
- 단위테스트
- 배열
- Eclipse
- vscode
- js
- html
- CSS
- 자바문법
- javascript
- 정규식
- input
- Java
- junit
Archives
- Today
- Total
어제 오늘 내일
[JUnit5] AfterEachCallback.afterEach() 실행 흐름 정리 본문
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 등을 후처리해야 할 때
특히 여러 테스트 클래스에서 공통적으로 필요한 정리 로직을 확장 하나로 통합할 수 있어 유지보수가 크게 쉬워진다.
반응형
'IT > JUnit' 카테고리의 다른 글
| [JUnit5] BeforeEachCallback.beforeEach() 실행 흐름 이해 (0) | 2026.01.24 |
|---|---|
| [JUnit5] dynamicContainer()로 테스트 그룹 구성하기 (0) | 2026.01.23 |
| [JUnit5] dynamicTest()로 동적 테스트 정의하기 (0) | 2026.01.23 |
| [JUnit5] TestReporter에서 Map 기반 로그 기록하기 (0) | 2026.01.22 |
| [JUnit5] TestReporter.publishEntry()로 테스트 로그 남기기 (0) | 2026.01.22 |
Comments
