跳到主要内容

@DirtiesContext

ChatGPT-4o-mini 中英对照 @DirtiesContext @DirtiesContext

@DirtiesContext 表示在测试执行过程中,底层的 Spring ApplicationContext 已被污染(即测试以某种方式修改或损坏了它——例如,通过改变单例 bean 的状态),并且应该被关闭。当一个应用程序上下文被标记为脏时,它会从测试框架的缓存中移除并关闭。因此,对于任何后续需要相同配置元数据的上下文的测试,底层的 Spring 容器将被重建。

您可以在同一个测试类或测试类层次结构中将 @DirtiesContext 用作类级别和方法级别的注解。在这种情况下,ApplicationContext 会在任何这样的注解方法之前或之后以及在当前测试类之前或之后被标记为脏,具体取决于配置的 methodModeclassMode。当 @DirtiesContext 同时在类级别和方法级别声明时,将遵循两个注解中配置的模式。例如,如果类模式设置为 BEFORE_EACH_TEST_METHOD 而方法模式设置为 AFTER_METHOD,则上下文将在给定测试方法之前和之后都被标记为脏。

以下示例解释了在各种配置场景下,何时上下文会被污染:

  • 在当前测试类之前,当在类上声明并将类模式设置为 BEFORE_CLASS 时。

    @DirtiesContext(classMode = BEFORE_CLASS) 1
    class FreshContextTests {
    // 一些需要新的 Spring 容器的测试
    }
    java
    • 在当前测试类之前弄脏上下文。

  • 在当前测试类之后,当在类上声明并将类模式设置为 AFTER_CLASS(即默认类模式)时。

    @DirtiesContext 1
    class ContextDirtyingTests {
    // 一些导致 Spring 容器被弄脏的测试
    }
    java
    • 在当前测试类之后弄脏上下文。

  • 在当前测试类中的每个测试方法之前,当在类上声明并将类模式设置为 BEFORE_EACH_TEST_METHOD 时。

    @DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) 1
    class FreshContextTests {
    // 一些需要新的 Spring 容器的测试
    }
    java
    • 在每个测试方法之前弄脏上下文。

  • 在当前测试类中的每个测试方法之后,当在类上声明并将类模式设置为 AFTER_EACH_TEST_METHOD 时。

    @DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) 1
    class ContextDirtyingTests {
    // 一些导致 Spring 容器被弄脏的测试
    }
    java
    • 在每个测试方法之后弄脏上下文。

  • 在当前测试之前,当在方法上声明并将方法模式设置为 BEFORE_METHOD 时。

    @DirtiesContext(methodMode = BEFORE_METHOD) 1
    @Test
    void testProcessWhichRequiresFreshAppCtx() {
    // 一些需要新的 Spring 容器的逻辑
    }
    java
    • 在当前测试方法之前弄脏上下文。

  • 在当前测试之后,当在方法上声明并将方法模式设置为 AFTER_METHOD(即默认方法模式)时。

    @DirtiesContext 1
    @Test
    void testProcessWhichDirtiesAppCtx() {
    // 一些导致 Spring 容器被弄脏的逻辑
    }
    java
    • 在当前测试方法之后弄脏上下文。

如果在一个使用 @ContextHierarchy 配置的上下文层次结构中的测试中使用 @DirtiesContext,您可以使用 hierarchyMode 标志来控制上下文缓存的清除方式。默认情况下,使用一种详尽的算法来清除上下文缓存,这不仅包括当前级别,还包括所有其他共享与当前测试的祖先上下文的上下文层次结构。所有位于公共祖先上下文的子层次结构中的 ApplicationContext 实例将从上下文缓存中移除并关闭。如果详尽算法对于特定用例来说过于复杂,您可以指定更简单的当前级别算法,如以下示例所示。

@ContextHierarchy({
@ContextConfiguration("/parent-config.xml"),
@ContextConfiguration("/child-config.xml")
})
class BaseTests {
// 类体...
}

class ExtendedTests extends BaseTests {

@Test
@DirtiesContext(hierarchyMode = CURRENT_LEVEL) 1
void test() {
// 一些逻辑导致子上下文被污染
}
}
java
  • 使用当前级别算法。

有关 EXHAUSTIVECURRENT_LEVEL 算法的更多详细信息,请参见 DirtiesContext.HierarchyMode javadoc。