跳到主要内容
版本:7.0.3

@DirtiesContext

Hunyuan 7b 中英对照 @DirtiesContext @DirtiesContext

@DirtiesContext 表示在测试执行过程中底层 Spring 的 ApplicationContext 被修改或破坏(例如,通过更改单例 bean 的状态),因此应该关闭该上下文。当一个应用程序上下文被标记为“脏”(dirty)时,它将从测试框架的缓存中移除并关闭。因此,对于后续需要相同配置元数据的测试,底层 Spring 容器将会被重新构建。

你可以在同一个测试类或测试类层次结构中,将@DirtiesContext同时用作类级别和方法级别的注解。在这种情况下,根据配置的methodModeclassModeApplicationContext会在任何带有此类注解的方法之前或之后,以及当前测试类之前或之后被标记为“脏”(dirty)状态。当@DirtiesContext在类级别和方法级别都存在时,两种注解所配置的模式都会被执行。例如,如果类模式设置为BEFORE_EACH_TEST_METHOD,而方法模式设置为AFTER_METHOD,那么在该测试方法之前和之后,上下文都会被标记为“脏”状态。

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

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

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

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

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

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

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

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

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

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

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

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

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

如果在测试中使用了@DirtiesContext,而该测试的上下文是通过@ContextHierarchy作为上下文层级结构的一部分进行配置的,那么你可以使用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() {
// 一些逻辑会导致子上下文被污染
}
}
  • 使用当前级别的算法。

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