嵌套类中使用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
相关产品推荐
相关产品推荐

