JUNIT 5:将spring组件注入自定义TestTemplateInvocationContextProvider

在JUnit Jupiter(JUnit 5)中是否有一种方法可以将Spring组件注入TestTemplateInvocationContextProvider?

解决方法:

是的,如果您在为测试类加载的Spring ApplicationContext中将TestTemplateInvocationContextProvider注册为bean,则可以将提供程序@Autowired放入一个字段,并使用@RegisterExtension注册为JUnit Jupiter扩展.诀窍是你需要使用每类测试实例生命周期模式,以便提供者尽早注册,以便JUnit Jupiter使用它.

以下是JUnit 5用户指南中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;
                        }
                    });
                }
            };
        }
    }

}
上一篇:junit5报错:WARNING: TestEngine with ID 'junit-jupite


下一篇:JUnit5学习之一:基本操作