TestExecutionListener
設定
Spring は、デフォルトで正確に次の順序で登録される次の TestExecutionListener
実装を提供します。
ServletTestExecutionListener
:WebApplicationContext
のサーブレット API モックを構成します。DirtiesContextBeforeModesTestExecutionListener
: 「前」モードの@DirtiesContext
アノテーションを処理します。ApplicationEventsTestExecutionListener
:ApplicationEvents
をサポートします。DependencyInjectionTestExecutionListener
: テストインスタンスに依存性注入を提供します。MicrometerObservationRegistryTestExecutionListener
: Micrometer のObservationRegistry
のサポートを提供します。DirtiesContextTestExecutionListener
: "after" モードの@DirtiesContext
アノテーションを処理します。TransactionalTestExecutionListener
: トランザクションテストの実行にデフォルトのロールバックセマンティクスを提供します。SqlScriptsTestExecutionListener
:@Sql
アノテーションを使用して構成された SQL スクリプトを実行します。EventPublishingTestExecutionListener
: テストの実行イベントをテストのApplicationContext
に公開します(テスト実行イベントを参照)。
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...
}