TestExecutionListener 設定
Spring は、デフォルトで正確に次の順序で登録される次の TestExecutionListener 実装を提供します。
ServletTestExecutionListener:WebApplicationContextのサーブレット API モックを構成します。DirtiesContextBeforeModesTestExecutionListener: 「前」モードの@DirtiesContextアノテーションを処理します。ApplicationEventsTestExecutionListener:ApplicationEventsをサポートします。BeanOverrideTestExecutionListener: テストでの Bean のオーバーライドをサポートします。DependencyInjectionTestExecutionListener: テストインスタンスに依存性注入を提供します。MicrometerObservationRegistryTestExecutionListener: Micrometer のObservationRegistryのサポートを提供します。DirtiesContextTestExecutionListener: 「後」モードの@DirtiesContextアノテーションを処理します。CommonCachesTestExecutionListener: 必要に応じて、テストのApplicationContext内のリソースキャッシュをクリアします。TransactionalTestExecutionListener: トランザクションテストの実行にデフォルトのロールバックセマンティクスを提供します。SqlScriptsTestExecutionListener:@Sqlアノテーションを使用して構成された SQL スクリプトを実行します。EventPublishingTestExecutionListener: テストの実行イベントをテストのApplicationContextに公開します(テスト実行イベントを参照)。MockitoResetTestExecutionListener:@MockitoBeanまたは@MockitoSpyBeanによって設定されたとおりにモックをリセットします。
TestExecutionListener 実装の登録
@TestExecutionListeners アノテーションを使用して、テストクラス、そのサブクラス、そのネストされたクラスの TestExecutionListener 実装を明示的に登録できます。詳細と例については、アノテーションのサポートと @TestExecutionListeners (Javadoc) の javadoc を参照してください。
デフォルトの TestExecutionListener 実装への切り替え
|
デフォルトの TestExecutionListener 実装の自動検出
@TestExecutionListeners を使用して TestExecutionListener 実装を登録することは、限られたテストシナリオで使用されるカスタムリスナーに適しています。ただし、テストスイート全体でカスタムリスナーを使用する必要がある場合は、面倒になります。この課題は、SpringFactoriesLoader メカニズムによるデフォルトの TestExecutionListener 実装の自動検出のサポートにより解決されています。
例: spring-test モジュールは、META-INF/spring.factories プロパティファイル [GitHub] (英語) の org.springframework.test.context.TestExecutionListener キーですべてのコアのデフォルト TestExecutionListener 実装を宣言します。サードパーティのフレームワークと開発者は、独自の spring.factories ファイルを通じて、同様の方法で独自の TestExecutionListener 実装をデフォルトリスナーのリストに提供できます。
TestExecutionListener 実装のオーダー
TestContext フレームワークが前述の SpringFactoriesLoader メカニズムを介してデフォルト TestExecutionListener 実装を発見すると、Spring の AnnotationAwareOrderComparator を使用してインスタンス化されたリスナーがソートされ、Spring の Ordered インターフェースと @Order アノテーションが順序付けされます。AbstractTestExecutionListener および Spring が提供するすべてのデフォルト TestExecutionListener 実装は、適切な値で Ordered を実装します。サードパーティのフレームワークと開発者は、Ordered を実装するか @Order を宣言することにより、デフォルトの TestExecutionListener 実装が適切な順序で登録されていることを確認する必要があります。各コアリスナーに割り当てられる値の詳細については、コアのデフォルト TestExecutionListener 実装の getOrder() メソッドの javadoc を参照してください。
TestExecutionListener 実装のマージ
カスタム TestExecutionListener が @TestExecutionListeners を介して登録されている場合、デフォルトのリスナーは登録されません。最も一般的なテストシナリオでは、これにより、開発者は、カスタムリスナーに加えて、すべてのデフォルトリスナーを手動で宣言する必要があります。次のリストは、このスタイルの構成を示しています。
Java
Kotlin
@ContextConfiguration
@TestExecutionListeners({
MyCustomTestExecutionListener.class,
ServletTestExecutionListener.class,
DirtiesContextBeforeModesTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
SqlScriptsTestExecutionListener.class
})
class MyTest {
// class body...
}@ContextConfiguration
@TestExecutionListeners(
MyCustomTestExecutionListener::class,
ServletTestExecutionListener::class,
DirtiesContextBeforeModesTestExecutionListener::class,
DependencyInjectionTestExecutionListener::class,
DirtiesContextTestExecutionListener::class,
TransactionalTestExecutionListener::class,
SqlScriptsTestExecutionListener::class
)
class MyTest {
// class body...
} このアプローチの課題は、開発者がデフォルトで登録されているリスナーを正確に知っている必要があることです。さらに、デフォルトリスナーのセットはリリースごとに変更できます。たとえば、SqlScriptsTestExecutionListener は Spring Framework 4.1 で導入され、DirtiesContextBeforeModesTestExecutionListener は Spring Framework 4.2 で導入されました。さらに、Spring Boot や Spring Security などのサードパーティフレームワークは、前述の自動検出メカニズムを使用して、独自のデフォルト TestExecutionListener 実装を登録します。
すべてのデフォルトリスナーを認識して再宣言する必要を回避するために、@TestExecutionListeners の mergeMode 属性を MergeMode.MERGE_WITH_DEFAULTS に設定できます。MERGE_WITH_DEFAULTS は、ローカルで宣言されたリスナーをデフォルトのリスナーとマージする必要があることを示します。マージアルゴリズムにより、TestExecutionListener 実装のオーダーに従って、重複がリストから削除され、マージされたリスナーの結果セットが AnnotationAwareOrderComparator のセマンティクスに従ってソートされます。リスナーが Ordered を実装するか、@Order のアノテーションが付けられている場合、リスナーがデフォルトとマージされる位置に影響を与える可能性があります。それ以外の場合、ローカルで宣言されたリスナーは、マージ時にデフォルトのリスナーのリストに追加されます。
例: 前の例の MyCustomTestExecutionListener クラスが order 値(たとえば 500)を ServletTestExecutionListener (たまたま 1000)の順序よりも小さくなるように構成した場合、MyCustomTestExecutionListener は自動的にデフォルトのリストにマージされます。ServletTestExecutionListener の前面、および前の例は次のように置き換えることができます。
Java
Kotlin
@ContextConfiguration
@TestExecutionListeners(
listeners = MyCustomTestExecutionListener.class,
mergeMode = MERGE_WITH_DEFAULTS
)
class MyTest {
// class body...
}@ContextConfiguration
@TestExecutionListeners(
listeners = [MyCustomTestExecutionListener::class],
mergeMode = MERGE_WITH_DEFAULTS
)
class MyTest {
// class body...
}