在Junit5中,当使用扩展时,我们可以运行BeforeAll和AfterAll方法,而我试图使用注释来更改测试的行为。 但是,我也将这些注释也用作@Qualifiers进行bean初始化,并希望能够使用测试中标识的Annotation来初始化bean
我希望使用我的限定符注释在运行时以编程方式初始化Bean
我知道Junit5的SpringExtension
可以
SpringExtension.getApplicationContext(context).getAutowireCapableBeanFactory()
使用哪个可以调用bean初始化工厂,但是我不知道如何使用作为限定符的Annotations初始化bean。 我有多个由限定符标识的相同类型的Bean
我遇到的问题是
当前,我正在使用AutoWired静态初始化用户凭证的类型,然后使用预先初始化的UserCredential(使用切换用例)对我的注释进行基础。
这个想法是要拥有一个测试类@ExtendsWith(ResetPortal.class)
,然后它指示可以用来重置(测试之前登录)的用户类型。
我正在使用限定符注释来表明这一点,然后可以从Junit5 ExtensionContext
方法的beforeAll
中提取这些内容
此外,我有一个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初始化该类并调用它的托管实例,因此需要分别定义自动装配的元素
@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;
}
}
}