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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:30:08