如何基于限定符注释以编程方式自动装配Bean

时间:2019-12-13 11:57:43

标签: java spring-boot spring-junit junit5-extension-model

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

0 个答案:

没有答案