You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套类中使用MockMvc时ApplicationContext不匹配问题咨询

你的解决方案完全合理,这是Spring测试上下文隔离的正确用法

当带有@TestPropertySource这类自定义配置的@Nested测试类存在时,Spring确实会为其创建独立的ApplicationContext——这是框架为了隔离不同测试场景配置的设计,避免不同测试用例的配置互相干扰。

基类中注入的MockMvc是绑定在基类的AnnotationConfigServletWebServerApplicationContext上的,而带自定义配置的嵌套类使用的是全新的GenericWebApplicationContext,两者上下文不匹配自然会导致问题。

你在嵌套类中单独注入MockMvc的做法完全正确:Spring会自动将这个MockMvc实例绑定到当前嵌套类对应的独立上下文上,确保测试时使用的MockMvc和上下文环境一致,完美解决上下文不匹配的问题。

修改后的示例代码如下:

@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class DemoControllerTests
{
    @Autowired
    private MockMvc mockMvc;

    @Nested
    class NestedClassWithoutCustomConfiguration
    {
        // 正常工作;mockMvc与嵌套类使用同一类型为AnnotationConfigServletWebServerApplicationContext的上下文
    }

    @Nested
    @TestPropertySource(properties = "foo=bar")
    class NestedClassWithCustomConfiguration
    {
        // 现在可以正常工作;MockMvc绑定到当前嵌套类的GenericWebApplicationContext
        @Autowired
        private MockMvc mockMvc;
    }
}

额外补充两点:

  • 每个带自定义配置的@Nested类都可以独立注入MockMvc,Spring会为每个这类嵌套类维护独立的上下文,注入的MockMvc会自动对应各自的环境。
  • 如果你的测试只需要聚焦Web层,也可以考虑使用@MockMvcTest替代@SpringBootTest + @AutoConfigureMockMvc,它会创建更轻量的Web上下文,但如果依赖完整的应用上下文(比如需要其他业务Bean),原来的方案依然是更合适的选择。

内容的提问来源于stack exchange,提问作者Sirea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:40:28