어제 오늘 내일

[JUnit5] ExtensionContext.getTestClass()로 테스트 클래스 접근하기 본문

IT/JUnit

[JUnit5] ExtensionContext.getTestClass()로 테스트 클래스 접근하기

hi.anna 2026. 1. 25. 08:18

1. ExtensionContext.getTestClass()란 무엇인가

ExtensionContext.getTestClass()는 JUnit5 확장 API에서 제공하는 메서드로,
현재 실행 중인 테스트가 속한 테스트 클래스 정보를 Optional<Class<?>> 형태로 반환한다.

확장에서 테스트 클래스 정보를 가져오면 다음과 같은 활용이 가능하다.

  • 클래스 기반 로깅
  • 클래스 애노테이션 검사
  • 클래스 단위 설정/초기화 로직 적용
  • 리플렉션 기반 유틸 처리

확장(Extension) 작성 시 가장 자주 사용하는 메타데이터 중 하나다.

 

2. 기본 사용 예제

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

public class ClassInfoExtension implements BeforeEachCallback {

    @Override
    public void beforeEach(ExtensionContext context) {
        context.getTestClass().ifPresent(clazz ->
            System.out.println("현재 테스트 클래스: " + clazz.getSimpleName())
        );
    }
}

설명

  • Optional<Class<?>>을 반환하므로 ifPresent() 방식으로 안전하게 처리한다.
  • 클래스명이 확장에서 바로 확인 가능하다.

 

3. 확장 적용 – @ExtendWith

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

@ExtendWith(ClassInfoExtension.class)
class ExtensionTest {

    @Test
    void sampleTest() {}
}

출력 예:

현재 테스트 클래스: ExtensionTest

 

 

4. 클래스 애노테이션 확인하기

테스트 클래스에 특정 애노테이션이 붙어 있는지 확인할 수 있다.

@Override
public void beforeEach(ExtensionContext context) {
    context.getTestClass().ifPresent(clazz -> {
        if (clazz.isAnnotationPresent(Deprecated.class)) {
            System.out.println("⚠ Deprecated 테스트 클래스입니다: " + clazz.getName());
        }
    });
}

활용 포인트

  • 커스텀 애노테이션 기반 조건 처리
  • 환경 설정 자동화
  • 클래스 단위 정책 적용

 

5. 클래스 정보를 사용한 로깅 패턴

@Override
public void beforeEach(ExtensionContext context) {
    String className = context.getTestClass()
                              .map(Class::getSimpleName)
                              .orElse("UnknownClass");

    System.out.println("[START CLASS] " + className);
}

설명

  • 프로젝트 규모가 커질수록 클래스 단위 로그는 분석에 매우 유용하다.
  • 테스트 컨테이너 구조를 확인할 때에도 도움된다.

 

6. 클래스 기반 초기화/정리 작업

확장에서 특정 클래스에만 적용하고 싶을 때 활용 가능하다.

@Override
public void beforeEach(ExtensionContext context) {
    context.getTestClass().ifPresent(clazz -> {
        if (clazz.getSimpleName().contains("DB")) {
            setupDatabase();
        }
    });
}

private void setupDatabase() {
    System.out.println("DB 초기화 로직 실행");
}

설명

  • 클래스명 또는 애노테이션을 기준으로 조건부 설정 로직을 적용할 수 있다.
  • 테스트 전용 공통 인프라 초기화가 가능해진다.

 

7. 동적 테스트 및 @Nested 클래스에서도 정상 동작

getTestClass()는 다음 두 경우에서도 올바른 클래스 정보를 제공한다.

  • @Nested 내부 테스트 클래스
  • Dynamic Test가 속한 실제 테스트 클래스

즉, 확장에서 항상 “현재 실행 중인 테스트 method가 어디에 속하는지” 정확히 추적할 수 있다.

 

8. getTestClass()를 사용하면 좋은 상황 요약

  • 여러 테스트 클래스에 걸쳐 공통 설정을 확장에서 관리할 때
  • 클래스 애노테이션 기반 실행 제어가 필요할 때
  • 테스트 클래스별 로깅 및 모니터링을 적용하고 싶을 때
  • 테스트 클래스 이름을 기준으로 분류/정책/조건을 적용할 때
  • 동적 테스트라도 소속된 클래스 정보를 사용해야 할 때

확장 API를 활용한 테스트 자동화 환경에서는 필수적으로 사용하는 API 중 하나다.

 

 

반응형
Comments