对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
@DirtiesContext
@DirtiesContext
表示底层的 SpringApplicationContext
已经
在执行测试期间被弄脏(即,测试在
某种方式 — 例如,通过更改单例 bean 的状态),并且应该是
闭。当应用程序上下文被标记为 dirty 时,它会从测试中删除
framework 的 cache 和 closed。因此,底层的 Spring 容器是
为需要具有相同配置的上下文的任何后续测试重新构建
元数据。
您可以使用@DirtiesContext
作为类级和方法级注解
相同的类或类层次结构。在这种情况下,ApplicationContext
已标记
作为 dirty 在任何此类 Comments 方法之前或之后,以及当前
test 类,具体取决于配置的methodMode
和classMode
.什么时候@DirtiesContext
在类级别和方法级别声明时,
将遵循来自两个 Comments 的 configured 模式。例如,如果类模式为
设置为BEFORE_EACH_TEST_METHOD
,并且 method mode (方法模式) 设置为AFTER_METHOD
这
context 将在给定的 test method 之前和之后都标记为 dirty。
以下示例说明了何时会为各种 配置场景:
-
在当前测试类之前,当在类模式设置为
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 弄脏当前测试类之后的上下文。 -
-
在当前测试类中的每个测试方法之前,当在具有 class mode 设置为
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 在每个测试方法之前弄脏上下文。 -
-
在当前测试类中的每个测试方法之后,当在类 mode 设置为
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
在其 context 配置为 context 一部分的测试中
hierarchy 替换为@ContextHierarchy
中,您可以使用hierarchyMode
flag 来控制方式
上下文缓存将被清除。默认情况下,使用穷举算法来清除
context cache,不仅包括当前级别,还包括所有其他上下文
共享当前测试通用的上级上下文的层次结构。都ApplicationContext
驻留在公共祖先的子层次结构中的实例
context 将从上下文缓存中删除并关闭。如果穷举算法是
overkill 对于特定用例,您可以指定更简单的 current level 算法
如下例所示。
-
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 | 使用 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 算法。 |
有关EXHAUSTIVE
和CURRENT_LEVEL
algorithms,请参阅DirtiesContext.HierarchyMode
javadoc 的