JUNIT 5: добавление компонентов пружины в пользовательский TestTemplateInvocationContextProvider - PullRequest
0 голосов
/ 08 мая 2018

Есть ли способ в JUnit Jupiter (JUnit 5), который позволяет внедрять компоненты Spring в TestTemplateInvocationContextProvider?

1 Ответ

0 голосов
/ 09 мая 2018

Да, если вы зарегистрируете свой TestTemplateInvocationContextProvider в качестве бина в Spring ApplicationContext, загруженного для вашего тестового класса, вы можете добавить провайдера @Autowired в поле и зарегистрировать его как расширение JUnit Jupiter, используя @RegisterExtension , Хитрость заключается в том, что вам нужно будет использовать режим жизненного цикла экземпляра для каждого класса, чтобы провайдер был зарегистрирован достаточно рано, чтобы JUnit Jupiter мог его использовать.

Ниже приведена измененная версия TestTemplateDemo из Руководства пользователя JUnit 5.

Тесты проходят "как есть", но вы можете удалить // из объявления @Bean для компонента baz, чтобы увидеть, что тест не пройден.

@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;
                        }
                    });
                }
            };
        }
    }

}
...