首页 > 解决方案 > @DirtiesContext 不适用于 @Nested 测试

问题描述

经过数小时的谷歌研究后,我仍然无法弄清楚如何@DirtiesContext@Nested课程一起使用。假设以下集成测试类:

@ExtendWith(SpringExtension.class)
@SpringBootTest
@AutoConfigureMockMvc(addFilters = false)
public class StuffIntegrationTests {

    @Autowired
    private StuffRepository stuffRepository;

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    // ...

    @BeforeEach
       private void setUp() {
       mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
       // ...
       }

    @DisplayName("POST - /stuffs")
    @Nested
    class saveStuff{

        @DisplayName("Return 2xx")
        @Nested
        class Return2xx{

           // some test methods

        @DisplayName("Return 4xx")
        @Nested
        class Return4xx{

          // some tests methods

    }

    @DisplayName("GET - /stuffs/{stuffId}")
    @Nested
    class findStuffById{

        @DisplayName("Return 2xx")
        @Nested
        class Return2xx{

           // some test methods

        @DisplayName("Return 4xx")
        @Nested
        class Return4xx{

          // some tests methods

    }
}

如您所见,我想通过按 Enpoints 将其拆分为嵌套类来使该类更具可读性,并且对于每个 Endpoint,都有嵌套类按 Http 响应状态拆分。

我尝试@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)在多个级别上使用它并没有在每个类之前清理 Spring Context,如果我把 @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)每个方法都放在上面,结果是一样的。

我的目标是在类的每个方法之前清理 Spring Context,SaveStuff并在类开始时只清理一次上下文findStuffById

非常感谢你的帮助。

标签: spring-bootintegration-testingjunit5

解决方案


@Nested在 Spring Framework 5.3 之前,Spring不支持从 JUnit Jupiter 测试类的封闭类继承测试配置。

有关详细信息,请参阅 Spring 参考手册的@Nested测试类配置部分。


推荐阅读