TestExecutionListener 設定

Spring は、デフォルトで正確に次の順序で登録される次の TestExecutionListener 実装を提供します。

  • ServletTestExecutionListenerWebApplicationContext のサーブレット 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 実装への切り替え

@TestExecutionListeners でアノテーションが付けられたクラスを継承し、リスナーのデフォルトセットを使用するように切り替える必要がある場合は、次のようにクラスにアノテーションを付けることができます。

  • Java

  • Kotlin

// Switch to default listeners
@TestExecutionListeners(
	listeners = {},
	inheritListeners = false,
	mergeMode = MERGE_WITH_DEFAULTS)
class MyTest extends BaseTest {
	// class body...
}
// Switch to default listeners
@TestExecutionListeners(
	listeners = [],
	inheritListeners = false,
	mergeMode = MERGE_WITH_DEFAULTS)
class MyTest : BaseTest {
	// class body...
}

デフォルトの 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...
}