@DirtiesContext
@DirtiesContext
@DirtiesContext 表示在测试执行过程中底层 Spring 的 ApplicationContext 被修改或破坏(例如,通过更改单例 bean 的状态),因此应该关闭该上下文。当一个应用程序上下文被标记为“脏”(dirty)时,它将从测试框架的缓存中移除并关闭。因此,对于后续需要相同配置元数据的测试,底层 Spring 容器将会被重新构建。
你可以在同一个测试类或测试类层次结构中,将@DirtiesContext同时用作类级别和方法级别的注解。在这种情况下,根据配置的methodMode和classMode,ApplicationContext会在任何带有此类注解的方法之前或之后,以及当前测试类之前或之后被标记为“脏”(dirty)状态。当@DirtiesContext在类级别和方法级别都存在时,两种注解所配置的模式都会被执行。例如,如果类模式设置为BEFORE_EACH_TEST_METHOD,而方法模式设置为AFTER_METHOD,那么在该测试方法之前和之后,上下文都会被标记为“脏”状态。
以下示例说明了在各种配置场景下,上下文何时会被污染:
-
在当前测试类之前,当在将类模式设置为
BEFORE_CLASS的类上声明时。- Java
- Kotlin
@DirtiesContext(classMode = BEFORE_CLASS) 1
class FreshContextTests {
// 一些需要新 Spring 容器的测试
}在当前测试类之前污染上下文。
@DirtiesContext(classMode = BEFORE_CLASS) 1
class FreshContextTests {
// 一些需要新 Spring 容器的测试
}在当前测试类之前污染上下文。
-
在当前测试类之后,当在将类模式设置为
AFTER_CLASS(即默认类模式)的类上声明时。- Java
- Kotlin
@DirtiesContext 1
class ContextDirtyingTests {
// 一些会导致 Spring 容器被污染的测试
}在当前测试类之后污染上下文。
@DirtiesContext 1
class ContextDirtyingTests {
// 一些会导致 Spring 容器被污染的测试
}在当前测试类之后污染上下文。
-
在当前测试类中的每个测试方法之前,当在将类模式设置为
BEFORE_EACH_TEST_METHOD的类上声明时。- Java
- Kotlin
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) 1
class FreshContextTests {
// 一些需要新 Spring 容器的测试
}在每个测试方法之前污染上下文。
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) 1
class FreshContextTests {
// 一些需要新 Spring 容器的测试
}在每个测试方法之前污染上下文。
-
在当前测试类中的每个测试方法之后,当在将类模式设置为
AFTER_EACH_TEST_METHOD的类上声明时。- Java
- Kotlin
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) 1
class ContextDirtyingTests {
// 一些会导致 Spring 容器被污染的测试
}在每个测试方法之后污染上下文。
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) 1
class ContextDirtyingTests {
// 一些会导致 Spring 容器被污染的测试
}在每个测试方法之后污染上下文。
-
在当前测试之前,当在将方法模式设置为
BEFORE_METHOD的方法上声明时。- Java
- Kotlin
@DirtiesContext(methodMode = BEFORE_METHOD) 1
@Test
void testProcessWhichRequiresFreshAppCtx() {
// 一些需要新 Spring 容器的逻辑
}在当前测试方法之前污染上下文。
@DirtiesContext(methodMode = BEFORE_METHOD) 1
@Test
fun testProcessWhichRequiresFreshAppCtx() {
// 一些需要新 Spring 容器的逻辑
}在当前测试方法之前污染上下文。
-
在当前测试之后,当在将方法模式设置为
AFTER_METHOD(即默认方法模式)的方法上声明时。- Java
- Kotlin
@DirtiesContext 1
@Test
void testProcessWhichDirtiesAppCtx() {
// 一些会导致 Spring 容器被污染的逻辑
}在当前测试方法之后污染上下文。
@DirtiesContext 1
@Test
fun testProcessWhichDirtiesAppCtx() {
// 一些会导致 Spring 容器被污染的逻辑
}在当前测试方法之后污染上下文。
如果在测试中使用了@DirtiesContext,而该测试的上下文是通过@ContextHierarchy作为上下文层级结构的一部分进行配置的,那么你可以使用hierarchyMode标志来控制上下文缓存如何被清除。默认情况下,会使用一种彻底的算法来清除上下文缓存,这不仅包括当前层级,还包括所有与当前测试共享相同祖先上下文的其它上下文层级。所有位于该共同祖先上下文子层级中的ApplicationContext实例都会从上下文缓存中移除并关闭。如果对于特定的用例来说,这种彻底的算法过于繁琐,你可以指定更简单的当前层级算法,如下例所示。
- Java
- Kotlin
@ContextHierarchy({
@ContextConfiguration("/parent-config.xml"),
@ContextConfiguration("/child-config.xml")
})
class BaseTests {
// 类体...
}
class ExtendedTests extends BaseTests {
@Test
@DirtiesContext(hierarchyMode = CURRENT_LEVEL) 1
void test() {
// 一些逻辑会导致子上下文被污染
}
}
使用当前级别的算法。
@ContextHierarchy(
-contextConfiguration("/parent-config.xml"),
-contextConfiguration("/child-config.xml")
open class BaseTests {
// 类体...
}
class ExtendedTests : BaseTests() {
@Test
@DirtiesContext(hierarchyMode = CURRENT_LEVEL) 1
_fun test() {
// 一些逻辑会导致子上下文被污染
}
}
使用当前级别的算法。
有关EXHAUSTIVE和CURRENT_LEVEL算法的更多详细信息,请参阅DirtiesContext.HierarchyMode的javadoc。