1

在 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;
      }
    }
}
4

0 回答 0