@DirtiesContext
@DirtiesContext 表示在测试执行期间底层的 Spring ApplicationContext 已被污染(即,测试以某种方式修改或破坏了它 — 例如,通过更改单例 Bean 的状态),并且应该被关闭。当一个应用程序上下文被标记为脏时,它将从测试框架的缓存中移除并关闭。因此,对于任何需要具有相同配置元数据的上下文的后续测试,底层的 Spring 容器将被重建。
你可以在同一个测试类或测试类层次结构中将 @DirtiesContext 用作类级别和方法级别的注解。在这种情况下,ApplicationContext 将在任何此类带注解的方法之前或之后,以及在当前测试类之前或之后被标记为脏,具体取决于配置的 methodMode 和 classMode。当 @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 | 使用当前级别算法。 |
有关 EXHAUSTIVE 和 CURRENT_LEVEL 算法的更多详细信息,请参阅 DirtiesContext.HierarchyMode javadoc。