어제 오늘 내일

[JUnit5] ExtensionContext.getTestMethod()로 메소드 정보 조회 본문

IT/JUnit

[JUnit5] ExtensionContext.getTestMethod()로 메소드 정보 조회

hi.anna 2026. 1. 26. 01:19

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

ExtensionContext.getTestMethod()는 현재 실행 중인 테스트가 어떤 테스트 메서드를 실행하고 있는지를 Optional<Method> 형태로 제공하는 JUnit5 확장 API이다.
확장에서 테스트 메서드 정보를 조회하면 다음과 같은 작업이 가능해진다.

  • 테스트 메서드 이름 기반 로깅
  • 테스트 메서드 애노테이션 검사
  • 메서드 시그니처 기반 조건 처리
  • 실행 중인 테스트 메서드에 맞춰 동적 설정 적용

확장을 활용하는 테스트 자동화 환경에서는 매우 빈번하게 사용되는 메타데이터 API다.

 

2. 기본 사용 예제

import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import java.lang.reflect.Method;

public class MethodInfoExtension implements BeforeEachCallback {

    @Override
    public void beforeEach(ExtensionContext context) {
        context.getTestMethod().ifPresent(method ->
            System.out.println("현재 실행 중인 테스트 메서드: " + method.getName())
        );
    }
}

설명

  • Optional이므로 ifPresent()를 사용해 안전하게 처리해야 한다.
  • 테스트 메서드명을 기반으로 확장에서 다양한 처리가 가능하다.

 

3. 확장 적용 – @ExtendWith

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

@ExtendWith(MethodInfoExtension.class)
class ExtensionTest {

    @Test
    void sampleTest() {}
}

출력 예:

현재 실행 중인 테스트 메서드: sampleTest

 

 

4. 메서드 애노테이션 검사하기

테스트 메서드에 특정 애노테이션(@DisplayName, @Tag, 커스텀 애노테이션 등)이 붙어 있는지 확인할 수 있다.

@Override
public void beforeEach(ExtensionContext context) {
    context.getTestMethod().ifPresent(method -> {
        if (method.isAnnotationPresent(Deprecated.class)) {
            System.out.println("⚠ Deprecated 테스트 메서드입니다: " + method.getName());
        }
    });
}

활용 포인트

  • 애노테이션 기반 조건 분기
  • 테스트 정책 자동화
  • 메소드별 특수 처리 적용

 

5. 리플렉션으로 메서드 시그니처 조회하기

파라미터 타입이나 반환 타입을 기반으로 조건을 처리할 수 있다.

@Override
public void beforeEach(ExtensionContext context) {
    context.getTestMethod().ifPresent(method -> {
        System.out.println("메서드 파라미터:");
        Arrays.stream(method.getParameters())
              .forEach(param -> System.out.println(" - " + param.getType().getSimpleName()));
    });
}

활용용도

  • 테스트 자동 생성/분석 도구에서 사용
  • 메서드 구조 기반의 메타 테스트 구성

 

6. 실행 순서에서 getTestMethod()의 위치

ExtensionContext.getTestMethod()는 BeforeEach, AfterEach, BeforeTestExecution, AfterTestExecution 등 모든 라이프사이클 콜백에서 조회 가능하다.

일반 실행 순서 내에서의 흐름은 다음과 같다.

BeforeEachCallback.beforeEach()  → 테스트 메서드 실행 → AfterEachCallback.afterEach()

각 시점에서 동일한 테스트 메서드를 조회할 수 있다.

 

7. 테스트 실패 시 메서드 정보 활용하기

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

public class FailureLoggingExtension implements AfterEachCallback {

    @Override
    public void afterEach(ExtensionContext context) {
        if (context.getExecutionException().isPresent()) {
            String methodName = context.getTestMethod()
                                       .map(Method::getName)
                                       .orElse("UnknownMethod");

            System.out.println("❌ 실패한 테스트 메서드: " + methodName);
        }
    }
}

설명

  • 테스트가 실패했을 때만 메서드명을 기록하는 패턴
  • CI 환경에서 테스트 실패 분석에 매우 유용함

 

8. @Nested 및 동적 테스트에서도 정상 작동

ExtensionContext.getTestMethod()는 다음 환경에서도 올바르게 메서드를 반환한다.

  • @Nested 내부 클래스의 테스트 메서드
  • Dynamic Test에서 실행되는 실제 테스트 람다(method는 없지만 컨텍스트 정보는 제공됨 → Optional.empty())

DynamicTest의 경우 “메서드”가 아니라 “동적 실행 단위”이므로 반환값이 비어 있을 수 있음에 주의.

 

9. getTestMethod()를 사용하면 좋은 상황 정리

  • 테스트 메서드명 기반 로깅/모니터링
  • 테스트 정책 또는 환경을 메서드별로 다르게 적용해야 할 때
  • 애노테이션 기반으로 테스트 실행 조건을 제어할 때
  • 메서드 정보를 분석해 자동화된 테스트 도구를 개발할 때
  • 테스트 실패 시 원인을 메서드 단위로 추적해야 할 때

확장 API를 활용하는 경우 getTestMethod()는 가장 중요한 테스트 메타데이터 조회 도구 중 하나이다.

 

 

반응형
Comments