Да, если вы зарегистрируете свой 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;
}
});
}
};
}
}
}