gpt4 book ai didi

spring - 六月 5 : Inject spring components to custom TestTemplateInvocationContextProvider

转载 作者:行者123 更新时间:2023-12-03 20:30:11 26 4
gpt4 key购买 nike

JUnit Jupiter (JUnit 5) 中有没有一种方法可以将 Spring 组件注入(inject)到 TestTemplateInvocationContextProvider 中? ?

最佳答案

是的,如果您注册 TestTemplateInvocationContextProvider作为 Spring 的 bean ApplicationContext为您的测试类加载,然后您可以让提供者 @Autowired进入一个字段并使用 @RegisterExtension 注册为 JUnit Jupiter 扩展.诀窍是您需要使用每类测试实例生命周期模式,以便提供者足够早地注册,以便 JUnit Jupiter 使用它。

以下是TestTemplateDemo的修改版来自 JUnit 5 用户指南。

测试“按原样”通过,但您可以删除 //来自 @Bean baz 的声明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;
}
});
}
};
}
}

}

关于spring - 六月 5 : Inject spring components to custom TestTemplateInvocationContextProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50237046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com