@DirtiesContext

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

你可以在同一个测试类或测试类层次结构中将 @DirtiesContext 同时用作类级别和方法级别的注释。在这样的场景中,ApplicationContext 在任何此类带注释的方法之前或之后以及在当前测试类之前或之后被标记为脏,具体取决于配置的 methodModeclassMode。当 @DirtiesContext 在类级别和方法级别同时声明时,将遵循来自这两个注释的配置模式。例如,如果类模式设置为 BEFORE_EACH_TEST_METHOD 而方法模式设置为 AFTER_METHOD,则上下文将在给定测试方法之前和之后被标记为脏。

以下示例说明了在各种配置场景中何时会弄脏上下文:

  • 在当前测试类的前面,在类模式设置为 `BEFORE_CLASS`的类上声明时。

Java
@DirtiesContext(classMode = BEFORE_CLASS) (1)
class FreshContextTests {
	// some tests that require a new Spring container
}
1 在当前测试类的前面弄乱上下文。
Kotlin
@DirtiesContext(classMode = BEFORE_CLASS) (1)
class FreshContextTests {
	// some tests that require a new Spring container
}
2 在当前测试类的前面弄乱上下文。
  • 在当前测试类的后面,在类模式设置为 `AFTER_CLASS`的类上声明时(即,默认的类模式)。

Java
@DirtiesContext (1)
class ContextDirtyingTests {
	// some tests that result in the Spring container being dirtied
}
1 在当前测试类的后面弄乱上下文。
Kotlin
@DirtiesContext (1)
class ContextDirtyingTests {
	// some tests that result in the Spring container being dirtied
}
2 在当前测试类的后面弄乱上下文。
  • 在当前测试类中的每个测试方法前面,在类模式设置为 `BEFORE_EACH_TEST_METHOD.`的类上声明时

Java
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) (1)
class FreshContextTests {
	// some tests that require a new Spring container
}
1 在每个测试方法前面弄乱上下文。
Kotlin
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) (1)
class FreshContextTests {
	// some tests that require a new Spring container
}
2 在每个测试方法前面弄乱上下文。
  • 在当前测试类中的每个测试方法后面,在类模式设置为 `AFTER_EACH_TEST_METHOD.`的类上声明时

Java
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) (1)
class ContextDirtyingTests {
	// some tests that result in the Spring container being dirtied
}
1 在每个测试方法后面弄乱上下文。
Kotlin
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) (1)
class ContextDirtyingTests {
	// some tests that result in the Spring container being dirtied
}
2 在每个测试方法后面弄乱上下文。
  • 在当前测试前面,在方法模式设置为 `BEFORE_METHOD`的方法上声明时。

Java
@DirtiesContext(methodMode = BEFORE_METHOD) (1)
@Test
void testProcessWhichRequiresFreshAppCtx() {
	// some logic that requires a new Spring container
}
1 在当前测试方法前面弄乱上下文。
Kotlin
@DirtiesContext(methodMode = BEFORE_METHOD) (1)
@Test
fun testProcessWhichRequiresFreshAppCtx() {
	// some logic that requires a new Spring container
}
2 在当前测试方法前面弄乱上下文。
  • 在当前测试后面,在方法模式设置为 `AFTER_METHOD`的方法上声明时(即,默认的方法模式)。

Java
@DirtiesContext (1)
@Test
void testProcessWhichDirtiesAppCtx() {
	// some logic that results in the Spring container being dirtied
}
1 在当前测试方法后面弄乱上下文。
Kotlin
@DirtiesContext (1)
@Test
fun testProcessWhichDirtiesAppCtx() {
	// some logic that results in the Spring container being dirtied
}
2 在当前测试方法后面弄乱上下文。

如果在 @ContextHierarchy 的 context 层次结构中配置的测试中使用 @DirtiesContext,则可以使用 hierarchyMode 标志控制如何清除 context 缓存。默认情况下,使用穷举算法来清除 context 缓存,不仅包括当前级别,还包括与当前测试共用常见祖先 context 的所有其他 context 层次结构。所有位于常见祖先 context 的从属层次结构中的 ApplicationContext 实例都会从 context 缓存中移除并关闭。如果对于特定用例来说穷举算法太过,则可以指定更简单的当前级别算法,如下面的示例所示。

Java
@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 Use the current-level algorithm.
Kotlin
@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
	}
}
2 Use the current-level algorithm.

有关 EXHAUSTIVECURRENT_LEVEL 算法的进一步详细信息,请参见 DirtiesContext.HierarchyMode javadoc。