@DirtiesContext
@DirtiesContext
は、基礎となる Spring ApplicationContext
がテストの実行中にダーティになったこと(つまり、テストが何らかの方法で変更または破損した - シングルトン Bean の状態を変更するなど)を閉じる必要があることを示します。アプリケーションコンテキストがダーティとしてマークされると、テストフレームワークのキャッシュから削除され、閉じられます。結果として、基盤となる Spring コンテナーは、同じ構成メタデータを持つコンテキストを必要とする後続のテストのために再構築されます。
@DirtiesContext
は、同じクラスまたはクラス階層内でクラスレベルのアノテーションとメソッドレベルのアノテーションの両方として使用できます。このようなシナリオでは、構成された methodMode
および classMode
に応じて、そのようなアノテーション付きメソッドの前後、および現在のテストクラスの前後で、ApplicationContext
がダーティとしてマークされます。@DirtiesContext
がクラスレベルとメソッドレベルの両方で宣言されている場合、両方のアノテーションから設定されたモードが尊重されます。例: クラスモードが BEFORE_EACH_TEST_METHOD
に設定され、メソッドモードが AFTER_METHOD
に設定されている場合、コンテキストは、指定されたテストメソッドの前後の両方でダーティとしてマークされます。
次の例は、さまざまな構成シナリオでコンテキストがダーティになる場合を説明しています。
現在のテストクラスの前で、クラスモードが
BEFORE_CLASS
に設定されているクラスで宣言された場合。Java
Kotlin
@DirtiesContext(classMode = BEFORE_CLASS) (1) class FreshContextTests { // some tests that require a new Spring container }
1 現在のテストクラスの前のコンテキストをダーティにします。 @DirtiesContext(classMode = BEFORE_CLASS) (1) class FreshContextTests { // some tests that require a new Spring container }
1 現在のテストクラスの前のコンテキストをダーティにします。 現在のテストクラスの後、クラスモードが
AFTER_CLASS
(つまり、デフォルトクラスモード)に設定されたクラスで宣言された場合。Java
Kotlin
@DirtiesContext (1) class ContextDirtyingTests { // some tests that result in the Spring container being dirtied }
1 現在のテストクラスの後にコンテキストをダーティにします。 @DirtiesContext (1) class ContextDirtyingTests { // some tests that result in the Spring container being dirtied }
1 現在のテストクラスの後にコンテキストをダーティにします。 クラスモードが
BEFORE_EACH_TEST_METHOD.
に設定されたクラスで宣言された場合、現在のテストクラスの各テストメソッドの前Java
Kotlin
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) (1) class FreshContextTests { // some tests that require a new Spring container }
1 各テストメソッドの前にコンテキストをダーティにします。 @DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) (1) class FreshContextTests { // some tests that require a new Spring container }
1 各テストメソッドの前にコンテキストをダーティにします。 現在のテストクラスの各テストメソッドの後、クラスモードが
AFTER_EACH_TEST_METHOD.
に設定されたクラスで宣言された場合Java
Kotlin
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) (1) class ContextDirtyingTests { // some tests that result in the Spring container being dirtied }
1 各テストメソッドの後にコンテキストをダーティにします。 @DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) (1) class ContextDirtyingTests { // some tests that result in the Spring container being dirtied }
1 各テストメソッドの後にコンテキストをダーティにします。 現在のテストの前、メソッドモードが
BEFORE_METHOD
に設定されたメソッドで宣言された場合。Java
Kotlin
@DirtiesContext(methodMode = BEFORE_METHOD) (1) @Test void testProcessWhichRequiresFreshAppCtx() { // some logic that requires a new Spring container }
1 現在のテストメソッドの前のコンテキストをダーティにします。 @DirtiesContext(methodMode = BEFORE_METHOD) (1) @Test fun testProcessWhichRequiresFreshAppCtx() { // some logic that requires a new Spring container }
1 現在のテストメソッドの前のコンテキストをダーティにします。 現在のテストの後、メソッドモードが
AFTER_METHOD
(つまり、デフォルトのメソッドモード)に設定されたメソッドで宣言されたとき。Java
Kotlin
@DirtiesContext (1) @Test void testProcessWhichDirtiesAppCtx() { // some logic that results in the Spring container being dirtied }
1 現在のテストメソッドの後にコンテキストをダーティにします。 @DirtiesContext (1) @Test fun testProcessWhichDirtiesAppCtx() { // some logic that results in the Spring container being dirtied }
1 現在のテストメソッドの後にコンテキストをダーティにします。
@ContextHierarchy
を使用してコンテキストがコンテキスト階層の一部として構成されているテストで @DirtiesContext
を使用する場合、hierarchyMode
フラグを使用してコンテキストキャッシュのクリア方法を制御できます。デフォルトでは、現在のレベルだけでなく、現在のテストに共通の祖先コンテキストを共有する他のすべてのコンテキスト階層も含めて、網羅的アルゴリズムを使用してコンテキストキャッシュをクリアします。共通の祖先コンテキストのサブ階層にあるすべての ApplicationContext
インスタンスは、コンテキストキャッシュから削除され、閉じられます。特定のユースケースで徹底的なアルゴリズムが過剰である場合、次の例に示すように、より単純な現在のレベルのアルゴリズムを指定できます。
Java
Kotlin
@ContextHierarchy({
@ContextConfiguration("/parent-config.xml"),
@ContextConfiguration("/child-config.xml")
})
class BaseTests {
// class body...
}
class ExtendedTests extends BaseTests {
@Test
@DirtiesContext(hierarchyMode = CURRENT_LEVEL) (1)
void test() {
// some logic that results in the child context being dirtied
}
}
1 | 現在のレベルのアルゴリズムを使用します。 |
@ContextHierarchy(
ContextConfiguration("/parent-config.xml"),
ContextConfiguration("/child-config.xml"))
open class BaseTests {
// class body...
}
class ExtendedTests : BaseTests() {
@Test
@DirtiesContext(hierarchyMode = CURRENT_LEVEL) (1)
fun test() {
// some logic that results in the child context being dirtied
}
}
1 | 現在のレベルのアルゴリズムを使用します。 |
EXHAUSTIVE
および CURRENT_LEVEL
アルゴリズムの詳細については、DirtiesContext.HierarchyMode
javadoc を参照してください。