@DirtiesContext
@DirtiesContext
表示在测试执行期间,底层的 Spring ApplicationContext
已经被污染(即,测试以某种方式修改或破坏了它,例如,通过改变单例 bean 的状态),因此应该关闭。当一个应用程序上下文被标记为脏时,它会从测试框架的缓存中移除并关闭。因此,对于任何后续需要具有相同配置元数据的上下文的测试,底层的 Spring 容器都会重建。
你可以在同一个测试类或测试类层次结构中,将 @DirtiesContext
作为类级别和方法级别的注解使用。在这种情况下,ApplicationContext
会在任何此类带注解的方法之前或之后,以及在当前测试类之前或之后被标记为脏,具体取决于配置的 methodMode
和 classMode
。当 @DirtiesContext
在类级别和方法级别都声明时,两个注解中配置的模式都将生效。例如,如果类模式设置为 BEFORE_EACH_TEST_METHOD
并且方法模式设置为 AFTER_METHOD
,则上下文将在给定测试方法之前和之后都被标记为脏。
以下示例解释了在各种配置场景下何时会污染上下文:
-
在当前测试类之前,当在类上声明且类模式设置为
BEFORE_CLASS
时。
- Java
-
@DirtiesContext(classMode = BEFORE_CLASS) [id="CO1-1"][id="CO1-1"][id="CO1-1"](1) class FreshContextTests { // some tests that require a new Spring container }
<1> 在当前测试类之前污染上下文。
- Kotlin
-
@DirtiesContext(classMode = BEFORE_CLASS) [id="CO2-1"][id="CO1-2"][id="CO2-1"](1) class FreshContextTests { // some tests that require a new Spring container }
<1> 在当前测试类之前污染上下文。
-
在当前测试类之后,当在类上声明且类模式设置为
AFTER_CLASS
时(即,默认类模式)。
- Java
-
@DirtiesContext [id="CO3-1"][id="CO1-3"][id="CO3-1"](1) class ContextDirtyingTests { // some tests that result in the Spring container being dirtied }
<1> 在当前测试类之后污染上下文。
- Kotlin
-
@DirtiesContext [id="CO4-1"][id="CO1-4"][id="CO4-1"](1) class ContextDirtyingTests { // some tests that result in the Spring container being dirtied }
<1> 在当前测试类之后污染上下文。
-
在当前测试类中的每个测试方法之前,当在类上声明且类模式设置为
BEFORE_EACH_TEST_METHOD
时。
- Java
-
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) [id="CO5-1"][id="CO1-5"][id="CO5-1"](1) class FreshContextTests { // some tests that require a new Spring container }
<1> 在每个测试方法之前污染上下文。
- Kotlin
-
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) [id="CO6-1"][id="CO1-6"][id="CO6-1"](1) class FreshContextTests { // some tests that require a new Spring container }
<1> 在每个测试方法之前污染上下文。
-
在当前测试类中的每个测试方法之后,当在类上声明且类模式设置为
AFTER_EACH_TEST_METHOD
时。
- Java
-
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) [id="CO7-1"][id="CO1-7"][id="CO7-1"](1) class ContextDirtyingTests { // some tests that result in the Spring container being dirtied }
<1> 在每个测试方法之后污染上下文。
- Kotlin
-
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) [id="CO8-1"][id="CO1-8"][id="CO8-1"](1) class ContextDirtyingTests { // some tests that result in the Spring container being dirtied }
<1> 在每个测试方法之后污染上下文。
-
在当前测试之前,当在方法上声明且方法模式设置为
BEFORE_METHOD
时。
- Java
-
@DirtiesContext(methodMode = BEFORE_METHOD) [id="CO9-1"][id="CO1-9"][id="CO9-1"](1) @Test void testProcessWhichRequiresFreshAppCtx() { // some logic that requires a new Spring container }
<1> 在当前测试方法之前污染上下文。
- Kotlin
-
@DirtiesContext(methodMode = BEFORE_METHOD) [id="CO10-1"][id="CO1-10"][id="CO10-1"](1) @Test fun testProcessWhichRequiresFreshAppCtx() { // some logic that requires a new Spring container }
<1> 在当前测试方法之前污染上下文。
-
在当前测试之后,当在方法上声明且方法模式设置为
AFTER_METHOD
时(即,默认方法模式)。
- Java
-
@DirtiesContext [id="CO11-1"][id="CO1-11"][id="CO11-1"](1) @Test void testProcessWhichDirtiesAppCtx() { // some logic that results in the Spring container being dirtied }
<1> 在当前测试方法之后污染上下文。
- Kotlin
-
@DirtiesContext [id="CO12-1"][id="CO1-12"][id="CO12-1"](1) @Test fun testProcessWhichDirtiesAppCtx() { // some logic that results in the Spring container being dirtied }
<1> 在当前测试方法之后污染上下文。
如果你在测试中使用 @DirtiesContext
,并且该测试的上下文是使用 @ContextHierarchy
配置为上下文层次结构的一部分,你可以使用 hierarchyMode
标志来控制上下文缓存的清除方式。默认情况下,使用一种详尽的算法来清除上下文缓存,不仅包括当前级别,还包括所有其他与当前测试共享共同祖先上下文的上下文层次结构。所有位于共同祖先上下文子层次结构中的 ApplicationContext
实例都会从上下文缓存中移除并关闭。如果详尽算法对于特定用例来说是过度清除,你可以指定更简单的当前级别算法,如下例所示。
- Java
-
@ContextHierarchy({ @ContextConfiguration("/parent-config.xml"), @ContextConfiguration("/child-config.xml") }) class BaseTests { // class body... } class ExtendedTests extends BaseTests { @Test @DirtiesContext(hierarchyMode = CURRENT_LEVEL) [id="CO13-1"][id="CO1-13"][id="CO13-1"](1) void test() { // some logic that results in the child context being dirtied } }
<1> 使用当前级别算法。
- Kotlin
-
@ContextHierarchy( ContextConfiguration("/parent-config.xml"), ContextConfiguration("/child-config.xml")) open class BaseTests { // class body... } class ExtendedTests : BaseTests() { @Test @DirtiesContext(hierarchyMode = CURRENT_LEVEL) [id="CO14-1"][id="CO1-14"][id="CO14-1"](1) fun test() { // some logic that results in the child context being dirtied } }
<1> 使用当前级别算法。
有关 EXHAUSTIVE
和 CURRENT_LEVEL
算法的更多详细信息,请参阅
DirtiesContext.HierarchyMode
的 javadoc。