在 Junit5 中,使用 Extensions 时,我们可以运行 BeforeAll 和 AfterAll 方法,我正在尝试使用 Annotations 更改测试的行为。但是,我将这些注释用作 @Qualifiers 以及 bean 初始化,并且希望能够使用测试中标识的 Annotation 来初始化 bean
我希望使用我知道SpringExtension
的 Junit5的限定符注释以编程方式在运行时初始化 Bean
SpringExtension.getApplicationContext(context).getAutowireCapableBeanFactory()
使用它我可以调用 bean 初始化工厂,但我不知道如何使用作为限定符的注释来初始化 bean 我有多个相同类型的 Bean,由限定符标识
我遇到的问题是
目前,我正在使用 AutoWired 静态初始化用户凭据的类型,然后基于我使用预初始化 UserCredential 的注释使用 switch case。
这个想法是有一个测试类@ExtendsWith(ResetPortal.class)
,然后它指示它可以使用哪种类型的用户来重置(测试前登录)。我正在使用 Qualifier Annotations 来表明这一点,然后我可以ExtensionContext
从 Junit5beforeAll
方法中提取它
此外,对于每种类型的用户,我都有一个UserCredential
类和该类的多个 @Bean 定义。
代码
bean定义,使用自定义限定符注解User1Qualifier
@Bean
@User1Qualifier
public static UserCredentials clientBankLogin(
@Value(LOGIN_USERNAME_1) String username,
@Value(LOGIN_PASSWORD_1) String password) {
return new UserCredentials(username, password);
}
我的自定义限定符如下(有多个)
@Qualifier
@CustomValueAnnotation("User1")
@Retention(RUNTIME)
@Target({FIELD, PARAMETER, TYPE, METHOD})
public @interface User1Qualifier {}
现在,在测试中,我尝试使用 ResetPortal 拾取的相同注释
@SpringBootTest
@ExtendWith({ResetPortal.class, SpringExtension.class})
final class LoginTest extends SpringTestBase {
@Test
@User1Qualifier
void clientLogin() {}
}
ResetPortal 类,由于 Junit5 初始化该类并调用它的托管实例,需要单独定义 Autowired 元素
@Service
public class ResetPortal implements BeforeEachCallback, AfterEachCallback {
static UserCredentials user1;
static UserCredentials user2;
Autowired
public void initializeLoginToPortal(@User1Qualifier UserCredentials u1,
@User2Qualifier UserCredentials u2) {
user1 = u1;
user2 = u2;
}
@Override
public void beforeEach(ExtensionContext context) {
// This is the custom Value annotation marked on each UserQualifier
// This is using AnnotationUtils#findAnnotation(java.lang.Class<?>, java.lang.Class<A>)
CustomValueAnnotation loginAs = getLoginAsAnnotation(context);
switch (loginAs){
case "User1" : loginWith(ResetPortal.user1); break;
case "User2" : loginWith(ResetPortal.user2); break;
}
}
}