JUnit5 메타 어노테이션(Meta Annotation)

JUnit5의 여러 확장 모델에 대한 설명

메타 어노테이션

JUnit Jupiter는 메타 어노테이션 메커니즘을 지원한다. 즉, 임의의 어노테이션을 결합한 다른 자체 어노테이션을 정의 할 수 있다.

동일한 어노테이션 조합을 여러 곳에서 사용하는 경우에는 모와서 하나로 다시 만든 어노테이션을 사용하므로써 재사용성을 높일 수 있다.

이는 확장 기능을 @ExtendWith을 사용하여 Class 객체를 직접 지정하는 것보다 자체 제작한 어노테이션을 넣어 특정 구현에서 분리 할 수 ​​있다는 장점이 있을 수 있다.

먼저 테스트 메소드나 라이프사이클 메소드 등의 인수을 받을 수 있게 해주는 ParameterResolver을 구현체를 만든다.

package com.devkuma.junit5.meta.annotaion;

import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;

public class MyParameterResolver implements ParameterResolver {

    @Override
    public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        return parameterContext.getParameter().getType().equals(String.class);
    }

    @Override
    public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
        return extensionContext.getRequiredTestMethod().getName();
    }
}

그러고, 앞에서 만든 MyParameterResolver을 확장 기능 @ExtendWith을 추가한 커스텀 어노테이션을 만든다.

package com.devkuma.junit5.meta.annotaion;

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

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@ExtendWith(MyParameterResolver.class)
public @interface MyParameterResolverExtension {
}

이제, 앞에서 만든 @MyParameterResolverExtension 어노테이션을 활용한 테스트해 보자.

package com.devkuma.junit5.meta.annotaion;

import org.junit.jupiter.api.Test;

@MyParameterResolverExtension
class MyParameterResolverTest {

    @Test
    void test1(String testMethodName) {
        System.out.println("[test1] testMethodName=" + testMethodName);
    }

    @Test
    void test2(String testMethodName) {
        System.out.println("[test2] testMethodName=" + testMethodName);
    }
}

실행 결과:

[test1] testMethodName=test1
[test2] testMethodName=test2


최종 수정 : 2023-01-07