@DirtiesContext

@DirtiesContext 指示在测试执行期间底层 Spring ApplicationContext 已被污染(即,测试以某种方式修改或破坏了它——例如,通过更改单例 Bean 的状态),并且应关闭。当应用程序上下文被标记为脏时,它将从测试框架的缓存中移除并关闭。因此,对于任何随后需要具有相同配置元数据的上下文的测试,底层 Spring 容器将被重建。

您可以在同一个测试类或测试类层次结构中将@DirtiesContext 作为类级别和方法级别注解使用。在这种情况下,ApplicationContext 会在任何此类带注解的方法之前或之后以及在当前测试类之前或之后被标记为脏,具体取决于配置的methodModeclassMode。当在类级别和方法级别都声明@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 在当前测试方法之后使上下文变脏。

如果您在测试中使用@DirtiesContext,而该测试的上下文是作为使用@ContextHierarchy 的上下文层次结构的一部分配置的,则可以使用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 使用当前级别算法。

有关EXHAUSTIVECURRENT_LEVEL 算法的更多详细信息,请参阅DirtiesContext.HierarchyMode javadoc。