@DirtiesContext
@DirtiesContext
指示在测试执行过程中(即测试以某种方式修改或损坏了基础的Spring ApplicationContext
,例如通过更改单例bean的状态),应关闭已经被污染的Spring ApplicationContext
。当应用程序上下文被标记为脏时,它将从测试框架的缓存中移除并关闭。因此,对于需要具有相同配置元数据的任何后续测试,底层的Spring容器将被重新构建。
您可以在同一个类或类层次结构中将@DirtiesContext
用作类级别和方法级别的注解。在这种情况下,根据配置的methodMode
和classMode
,在任何这样注释的方法之前或之后以及在当前测试类之前或之后,ApplicationContext
都会被标记为脏。当@DirtiesContext
同时在类级别和方法级别声明时,将遵守两个注解的配置模式。例如,如果类模式设置为BEFORE_EACH_TEST_METHOD
,方法模式设置为AFTER_METHOD
,则在给定测试方法之前和之后都会将上下文标记为脏。
以下示例解释了在各种配置方案下上下文何时会被标记为脏:
-
在当前测试类之前声明,当在类上设置类模式为
BEFORE_CLASS
时。-
Java
-
Kotlin
@DirtiesContext(classMode = BEFORE_CLASS) (1) class FreshContextTests { // 需要一个新的Spring容器的一些测试 }
1 在当前测试类之前使上下文变脏。 @DirtiesContext(classMode = BEFORE_CLASS) (1) class FreshContextTests { // 需要一个新的Spring容器的一些测试 }
1 在当前测试类之前使上下文变脏。 -
-
在当前测试类之后声明,当在类上设置类模式为
AFTER_CLASS
(即默认的类模式)。-
Java
-
Kotlin
@DirtiesContext (1) class ContextDirtyingTests { // 导致Spring容器变脏的一些测试 }
1 在当前测试类之后使上下文变脏。 @DirtiesContext (1) class ContextDirtyingTests { // 导致Spring容器变脏的一些测试 }
1 在当前测试类之后使上下文变脏。 -
-
在当前测试类中的每个测试方法之前声明,当在类上设置类模式为
BEFORE_EACH_TEST_METHOD
时。-
Java
-
Kotlin
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) (1) class FreshContextTests { // 需要一个新的Spring容器的一些测试 }
1 在每个测试方法之前使上下文变脏。 @DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) (1) class FreshContextTests { // 需要一个新的Spring容器的一些测试 }
1 在每个测试方法之前使上下文变脏。 -
-
在当前测试类中的每个测试方法之后声明,当在类上设置类模式为
AFTER_EACH_TEST_METHOD
时。-
Java
-
Kotlin
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) (1) class ContextDirtyingTests { // 导致Spring容器变脏的一些测试 }
1 在每个测试方法之后使上下文变脏。 @DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) (1) class ContextDirtyingTests { // 导致Spring容器变脏的一些测试 }
1 在每个测试方法之后使上下文变脏。 -
-
在当前测试之前声明,当在方法上设置方法模式为
BEFORE_METHOD
时。-
Java
-
Kotlin
@DirtiesContext(methodMode = BEFORE_METHOD) (1) @Test void testProcessWhichRequiresFreshAppCtx() { // 一些需要一个新的Spring容器的逻辑 }
1 在当前测试方法之前使上下文变脏。 @DirtiesContext(methodMode = BEFORE_METHOD) (1) @Test fun testProcessWhichRequiresFreshAppCtx() { // 一些需要一个新的Spring容器的逻辑 }
1 在当前测试方法之前使上下文变脏。 -
-
在当前测试之后声明,当在方法上设置方法模式为
AFTER_METHOD
(即默认的方法模式)。-
Java
-
Kotlin
@DirtiesContext (1) @Test void testProcessWhichDirtiesAppCtx() { // 导致Spring容器变脏的一些逻辑 }
1 在当前测试方法之后使上下文变脏。 @DirtiesContext (1) @Test fun testProcessWhichDirtiesAppCtx() { // 导致Spring容器变脏的一些逻辑 }
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。