Spring MVC测试出现AssertionError:未找到ModelAndView问题求助
排查@WebMvcTest下"No ModelAndView found"错误
这个错误大概率是@WebMvcTest的上下文配置和你的控制器视图返回逻辑不匹配导致的,下面一步步拆解问题并给出解决方案:
1. 视图解析器未被正确加载
你的控制器返回的是视图名"Myaccount",但@WebMvcTest默认只聚焦加载Web层核心组件。如果你的项目使用了Thymeleaf这类模板引擎,需要确保对应的自动配置能被测试上下文识别到:
- 先确认项目依赖中包含了模板引擎的starter(比如
spring-boot-starter-thymeleaf),@WebMvcTest通常会自动加载这类依赖的配置; - 如果自动配置不生效,可以手动在测试类里添加简易的视图解析器配置:
@Configuration static class TestViewConfig { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".html"); return resolver; } }
2. 多余的上下文配置引发冲突
你在测试类上添加的@EntityScan和@ContextConfiguration(classes = {SecurityConfig.class}),和@WebMvcTest的设计初衷冲突:它本是用来隔离测试Web层的,额外引入持久层组件(@EntityScan)会让上下文加载变得复杂,甚至干扰ModelAndView的生成。
优化方案:
- 直接移除
@EntityScan,测试Web层完全不需要加载实体类和Repository; - 如果需要引入Security配置,改用
@WebMvcTest的includeFilters来指定,同时注意secure=false在Spring Boot 2.x及以上已被弃用,改用关闭安全过滤器的注解:
@WebMvcTest( value = HomeController.class, includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = SecurityConfig.class) ) @AutoConfigureMockMvc(addFilters = false) // 替代弃用的secure=false
3. 调整测试断言的逻辑
如果只是想验证model属性是否被正确添加,可以换一种更稳妥的断言方式,不需要依赖ModelAndView的存在:
@Test public void showLoginPage() throws Exception { mockMvc.perform(get("/login") .accept(MediaType.TEXT_HTML) .contentType(MediaType.TEXT_HTML) ) .andExpect(status().isOk()) // 先确认请求成功 .andExpect(model().attributeExists("classActiveLogin")); }
为什么@SpringBootTest能正常通过?
@SpringBootTest会加载完整的应用上下文,包括所有自动配置(视图解析器、Security、持久层等),视图能被正常解析,ModelAndView也能正确生成,因此测试不会报错。
内容的提问来源于stack exchange,提问作者valen ezu
相关产品推荐
相关产品推荐

