@TestBean
@TestBean
は、テストクラスの非静的フィールドで使用され、テストの ApplicationContext
内の特定の Bean を、ファクトリメソッドによって提供されるインスタンスでオーバーライドします。
関連するファクトリメソッド名は、アノテーションが付けられたフィールドの名前、または指定されている場合は Bean 名から派生します。ファクトリメソッドは static
で、引数を受け入れず、オーバーライドする Bean の型と互換性のある戻り値の型を持つ必要があります。より明確にするため、または別の名前を使用する場合は、アノテーションを使用して特定のメソッド名を指定できます。
デフォルトでは、アノテーション付きフィールドの型を使用して、オーバーライドする候補 Bean を検索します。複数の候補が一致する場合、オーバーライドする候補を絞り込むために @Qualifier
を指定できます。または、Bean 名がフィールド名と一致する候補が一致します。
対応する Bean が存在しない場合は、Bean が作成されます。ただし、対応する Bean が存在しない場合にテストを失敗させたい場合は、enforceOverride
属性を true
(たとえば、@TestBean(enforceOverride = true)
) に設定できます。
型によるオーバーライドではなく名前によるオーバーライドを使用するには、アノテーションの name
属性を指定します。
フィールド名などの修飾子は、別の |
このようなフィールドとメソッドは、プロジェクトのニーズやコーディング方法に応じて、 |
次の例は、@TestBean
アノテーションのデフォルトの動作を使用する方法を示しています。
Java
class OverrideBeanTests {
@TestBean (1)
CustomService customService;
// test case body...
static CustomService customService() { (2)
return new MyFakeCustomService();
}
}
1 | Bean を型 CustomService で上書きするフィールドをマークします。 |
2 | この静的メソッドの結果はインスタンスとして使用され、フィールドに注入されます。 |
上記の例では、型 CustomService
で Bean をオーバーライドしています。その型の Bean が複数存在する場合は、customService
という名前の Bean が考慮されます。そうでない場合、テストは失敗し、オーバーライドする CustomService
Bean を識別するために何らかの修飾子を指定する必要があります。
次の例では、型による検索ではなく、名前による検索を使用しています。
Java
class OverrideBeanTests {
@TestBean(name = "service", methodName = "createCustomService") (1)
CustomService customService;
// test case body...
static CustomService createCustomService() { (2)
return new MyFakeCustomService();
}
}
1 | Bean をオーバーライドするためのフィールドを service という名前でマークし、ファクトリメソッドの名前が createCustomService であることを指定します。 |
2 | この静的メソッドの結果はインスタンスとして使用され、フィールドに注入されます。 |
Spring は、テストクラス、テストクラス階層、 あるいは、外部クラスのファクトリメソッドは、構文 |
オーバーライドできるのはシングルトン Bean のみです。非シングルトン Bean をオーバーライドしようとすると、例外が発生します。
|