@TestBean

@TestBean は、テストクラスの非静的フィールドで使用され、テストの ApplicationContext 内の特定の Bean を、ファクトリメソッドによって提供されるインスタンスでオーバーライドします。

関連するファクトリメソッド名は、アノテーションが付けられたフィールドの名前、または指定されている場合は Bean 名から派生します。ファクトリメソッドは static で、引数を受け入れず、オーバーライドする Bean の型と互換性のある戻り値の型を持つ必要があります。より明確にするため、または別の名前を使用する場合は、アノテーションを使用して特定のメソッド名を指定できます。

デフォルトでは、アノテーション付きフィールドの型を使用して、オーバーライドする候補 Bean を検索します。複数の候補が一致する場合、オーバーライドする候補を絞り込むために @Qualifier を指定できます。または、Bean 名がフィールド名と一致する候補が一致します。

対応する Bean が存在しない場合は、Bean が作成されます。ただし、対応する Bean が存在しない場合にテストを失敗させたい場合は、enforceOverride 属性を true (たとえば、@TestBean(enforceOverride = true)) に設定できます。

型によるオーバーライドではなく名前によるオーバーライドを使用するには、アノテーションの name 属性を指定します。

フィールド名などの修飾子は、別の ApplicationContext を作成する必要があるかどうかを判断するために使用されます。この機能を使用して複数のテストで同じ Bean をオーバーライドする場合は、不要なコンテキストを作成しないように、フィールドに一貫した名前を付けるようにしてください。

@TestBean フィールドまたはファクトリメソッドの可視性に制限はありません。

このようなフィールドとメソッドは、プロジェクトのニーズやコーディング方法に応じて、publicprotected、パッケージプライベート (デフォルトの可視性)、または private になります。

次の例は、@TestBean アノテーションのデフォルトの動作を使用する方法を示しています。

  • Java

class OverrideBeanTests {
	@TestBean (1)
	CustomService customService;

	// test case body...

	static CustomService customService() { (2)
		return new MyFakeCustomService();
	}
}
1Bean を型 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();
	}
}
1Bean をオーバーライドするためのフィールドを service という名前でマークし、ファクトリメソッドの名前が createCustomService であることを指定します。
2 この静的メソッドの結果はインスタンスとして使用され、フィールドに注入されます。

Spring は、テストクラス、テストクラス階層、@Nested テストクラスの包含クラス階層で呼び出すファクトリメソッドを検索します。

あるいは、外部クラスのファクトリメソッドは、構文 <fully-qualified class name>#<method name> に従う完全修飾メソッド名 (例: methodName = "org.example.TestUtils#createCustomService") を介して参照できます。

オーバーライドできるのはシングルトン Bean のみです。非シングルトン Bean をオーバーライドしようとすると、例外が発生します。

FactoryBean によって作成された Bean をオーバーライドすると、FactoryBean は、@TestBean ファクトリメソッドから返された値に対応するシングルトン Bean に置き換えられます。