@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 を参照してください。