JUnit5:将spring组件注入到定制TestTemplateInvocationContextProvider

JUnit5:将spring组件注入到定制TestTemplateInvocationContextProvider,spring,junit5,Spring,Junit5,JUnit Jupiter(JUnit 5)中是否有一种方法可以将Spring组件注入到为您的测试类加载的SpringApplicationContext中?是的,如果您将您的TestTemplateInvocationContextProvider注册为bean,然后,您可以使用@RegisterExtension将提供程序@自动连接到一个字段中,并注册为JUnit Jupiter扩展。诀窍在于,您需要使用每类测试实例生命周期模式,以便尽早注册提供程序,以便JUnit Jupiter使用它 以

JUnit Jupiter(JUnit 5)中是否有一种方法可以将Spring组件注入到为您的测试类加载的Spring
ApplicationContext
中?

是的,如果您将您的
TestTemplateInvocationContextProvider
注册为bean,然后,您可以使用
@RegisterExtension
将提供程序
@自动连接到一个字段中,并注册为JUnit Jupiter扩展。诀窍在于,您需要使用每类测试实例生命周期模式,以便尽早注册提供程序,以便JUnit Jupiter使用它

以下是JUnit 5用户指南中的
TestTemplateDemo
的修改版本

测试“按原样”通过,但您可以从
@Bean
声明中删除
/
,以便
baz
Bean看到测试失败

@SpringJUnitConfig
@测试(每类生命周期)
类TestTemplateDemo{
@自动连线
@注册扩展
TestTemplateInvocationContextProvider TestTemplateInvocationContextProvider;
@测试模板
void testTemplate(字符串参数){
assertTrue(“foo”.equals(参数)| |“bar”.equals(参数));
}
@配置
静态类配置{
@豆子
字符串foo(){
返回“foo”;
}
@豆子
字符串条(){
返回“bar”;
}
//@Bean
字符串baz(){
返回“baz”;
}
@豆子
TestTemplateInvocationContextProvider myTestTemplateInvocationContextProvider(
列表参数){
返回新的MyTestTemplateInvocationContextProvider(参数);
}
}
公共静态类MyTestTemplateInvocationContextProvider
实现TestTemplateInvocationContextProvider{
私有最终列表参数;
公共MyTestTemplateInvocationContextProvider(列表参数){
此参数=参数;
}
@凌驾
公共布尔支持stTemplate(ExtensionContext上下文){
返回true;
}
@凌驾
公共流提供TestTemplateInvocationContext(
ExtensionContext(上下文){
返回这个.parameters.stream().map(p->invocationContext(p));
}
私有TestTemplateInvocationContext(字符串参数){
返回新的TestTemplateInvocationContext(){
@凌驾
公共字符串getDisplayName(int调用索引){
返回参数;
}
@凌驾
公共列表getAdditionalExtensions(){
return Collections.singletonList(新参数resolver(){
@凌驾
公共布尔支持参数表(
ParameterContext ParameterContext,
ExtensionContext(扩展上下文){
返回parameterContext.getParameter().getType().equals(
字符串(类);
}
@凌驾
公共对象resolveParameter(ParameterContext ParameterContext,
ExtensionContext(扩展上下文){
返回参数;
}
});
}
};
}
}
}