복붙노트

[SPRING] JUNIT 5 : 사용자 정의 TestTemplateInvocationContextProvider에 스프링 구성 요소 주입

SPRING

JUNIT 5 : 사용자 정의 TestTemplateInvocationContextProvider에 스프링 구성 요소 주입

JUnit Jupiter (JUnit 5)에서 Spring 구성 요소를 TestTemplateInvocationContextProvider에 삽입 할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.예. TestTemplateInvocationContextProvider를 테스트 클래스 용으로로드 된 Spring ApplicationContext에 Bean으로 등록하면 공급자로 @Autowired를 필드에 넣고 @RegisterExtension을 사용하여 JUnit Jupiter 확장으로 등록 할 수 있습니다. JUnit Jupiter가 사용하기에 앞서 프로 바이더를 등록하기 위해서는 클래스 별 테스트 인스턴스 라이프 사이클 모드를 사용해야 할 것입니다.

    예. TestTemplateInvocationContextProvider를 테스트 클래스 용으로로드 된 Spring ApplicationContext에 Bean으로 등록하면 공급자로 @Autowired를 필드에 넣고 @RegisterExtension을 사용하여 JUnit Jupiter 확장으로 등록 할 수 있습니다. JUnit Jupiter가 사용하기에 앞서 프로 바이더를 등록하기 위해서는 클래스 별 테스트 인스턴스 라이프 사이클 모드를 사용해야 할 것입니다.

    다음은 JUnit 5 User Guide의 TestTemplateDemo 수정 된 버전입니다.

    테스트는 "있는 그대로"전달되지만 baz bean에 대한 @Bean 선언에서 // 제거하여 테스트 실패를 확인할 수 있습니다.

    @SpringJUnitConfig
    @TestInstance(Lifecycle.PER_CLASS)
    class TestTemplateDemo {
    
        @Autowired
        @RegisterExtension
        TestTemplateInvocationContextProvider testTemplateInvocationContextProvider;
    
        @TestTemplate
        void testTemplate(String parameter) {
            assertTrue("foo".equals(parameter) || "bar".equals(parameter));
        }
    
        @Configuration
        static class Config {
    
            @Bean
            String foo() {
                return "foo";
            }
    
            @Bean
            String bar() {
                return "bar";
            }
    
            // @Bean
            String baz() {
                return "baz";
            }
    
            @Bean
            TestTemplateInvocationContextProvider myTestTemplateInvocationContextProvider(
                    List<String> parameters) {
    
                return new MyTestTemplateInvocationContextProvider(parameters);
            }
        }
    
        public static class MyTestTemplateInvocationContextProvider
                implements TestTemplateInvocationContextProvider {
    
            private final List<String> parameters;
    
            public MyTestTemplateInvocationContextProvider(List<String> parameters) {
                this.parameters = parameters;
            }
    
            @Override
            public boolean supportsTestTemplate(ExtensionContext context) {
                return true;
            }
    
            @Override
            public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(
                    ExtensionContext context) {
    
                return this.parameters.stream().map(p -> invocationContext(p));
            }
    
            private TestTemplateInvocationContext invocationContext(String parameter) {
                return new TestTemplateInvocationContext() {
    
                    @Override
                    public String getDisplayName(int invocationIndex) {
                        return parameter;
                    }
    
                    @Override
                    public List<Extension> getAdditionalExtensions() {
                        return Collections.singletonList(new ParameterResolver() {
    
                            @Override
                            public boolean supportsParameter(
                                    ParameterContext parameterContext,
                                    ExtensionContext extensionContext) {
                                return parameterContext.getParameter().getType().equals(
                                        String.class);
                            }
    
                            @Override
                            public Object resolveParameter(ParameterContext parameterContext,
                                    ExtensionContext extensionContext) {
                                return parameter;
                            }
                        });
                    }
                };
            }
        }
    
    }
    
  2. from https://stackoverflow.com/questions/50237046/junit-5-inject-spring-components-to-custom-testtemplateinvocationcontextprovide by cc-by-sa and MIT license