1

Junit5 では、Extensions を使用すると、BeforeAll メソッドと AfterAll メソッドを実行できます。また、Annotations を使用してテストの動作を変更しようとしています。ただし、これらの注釈を @Qualifiers としても Bean の初期化に使用しており、テストで識別された注釈を使用して Bean を初期化できるようにしたいと考えています。

SpringExtensionJunit5 で取得できることがわかっている修飾子アノテーションを使用して、実行時にプログラムで Bean を初期化したい

SpringExtension.getApplicationContext(context).getAutowireCapableBeanFactory()

これを使用して Bean 初期化ファクトリーを呼び出すことができますが、修飾子である注釈を使用して Bean を初期化する方法がわかりません。修飾子によって識別される同じタイプの複数の Bean があります。

私が立ち往生している問題は

現在、AutoWired を使用して Type of user credentials を静的に初期化してから、スイッチケースを使用して事前に初期化された UserCredential を使用している注釈に基づいています。

アイデアは、テスト クラス@ExtendsWith(ResetPortal.class)を用意し、リセット (テスト前のログイン) に使用できるユーザーのタイプを示すことです。Qualifier Annotations を使用してそれを示しています。これはExtensionContext、Junit5beforeAllメソッドから抽出できます。

さらに、UserCredentialユーザーのタイプごとに 1 つのクラスとそのクラスの複数の @Bean 定義があります。

コード

カスタム修飾子アノテーション User1Qualifier を使用した Bean 定義

@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() {}
}

Junit5 がクラスを初期化し、そのマネージド インスタンスを呼び出すため、ResetPortal クラスは 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