对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

@DirtiesContext

@DirtiesContext表示底层的 SpringApplicationContext已经 在执行测试期间被弄脏(即,测试在 某种方式 — 例如,通过更改单例 bean 的状态),并且应该是 闭。当应用程序上下文被标记为 dirty 时,它会从测试中删除 framework 的 cache 和 closed。因此,底层的 Spring 容器是 为需要具有相同配置的上下文的任何后续测试重新构建 元数据。spring-doc.cadn.net.cn

您可以使用@DirtiesContext作为类级和方法级注解 相同的类或类层次结构。在这种情况下,ApplicationContext已标记 作为 dirty 在任何此类 Comments 方法之前或之后,以及当前 test 类,具体取决于配置的methodModeclassMode.什么时候@DirtiesContext在类级别和方法级别声明时, 将遵循来自两个 Comments 的 configured 模式。例如,如果类模式为 设置为BEFORE_EACH_TEST_METHOD,并且 method mode (方法模式) 设置为AFTER_METHOD这 context 将在给定的 test method 之前和之后都标记为 dirty。spring-doc.cadn.net.cn

以下示例说明了何时会为各种 配置场景:spring-doc.cadn.net.cn

  • 在当前测试类之前,当在类模式设置为BEFORE_CLASS.spring-doc.cadn.net.cn

    @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(即默认的类模式)。spring-doc.cadn.net.cn

    @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 弄脏当前测试类之后的上下文。
  • 在当前测试类中的每个测试方法之前,当在具有 class mode 设置为BEFORE_EACH_TEST_METHOD.spring-doc.cadn.net.cn

    @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 在每个测试方法之前弄脏上下文。
  • 在当前测试类中的每个测试方法之后,当在类 mode 设置为AFTER_EACH_TEST_METHOD.spring-doc.cadn.net.cn

    @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.spring-doc.cadn.net.cn

    @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(即默认方法模式)。spring-doc.cadn.net.cn

    @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在其 context 配置为 context 一部分的测试中 hierarchy 替换为@ContextHierarchy中,您可以使用hierarchyModeflag 来控制方式 上下文缓存将被清除。默认情况下,使用穷举算法来清除 context cache,不仅包括当前级别,还包括所有其他上下文 共享当前测试通用的上级上下文的层次结构。都ApplicationContext驻留在公共祖先的子层次结构中的实例 context 将从上下文缓存中删除并关闭。如果穷举算法是 overkill 对于特定用例,您可以指定更简单的 current level 算法 如下例所示。spring-doc.cadn.net.cn

@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 使用 current-level 算法。
@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 使用 current-level 算法。

有关EXHAUSTIVECURRENT_LEVELalgorithms,请参阅DirtiesContext.HierarchyModejavadoc 的spring-doc.cadn.net.cn