Junit5 では、Extensions を使用すると、BeforeAll メソッドと AfterAll メソッドを実行できます。また、Annotations を使用してテストの動作を変更しようとしています。ただし、これらの注釈を @Qualifiers としても Bean の初期化に使用しており、テストで識別された注釈を使用して Bean を初期化できるようにしたいと考えています。
SpringExtension
Junit5 で取得できることがわかっている修飾子アノテーションを使用して、実行時にプログラムで 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;
}
}
}