Spring MVC集成测试失败:无法找到要返回的HTML页面
嘿,我来帮你排查下这个JUnit集成测试找不到HTML页面的问题~结合你的技术栈(Maven+Spring5+Thymeleaf),大概率是这几个环节出了问题,一个个来核对:
测试类缺失Web上下文相关注解
集成Web应用的测试必须加载Web上下文,你当前的测试类只加了@RunWith和@Transactional,还需要添加@WebAppConfiguration来启用Web环境,同时通过@ContextConfiguration指定Spring配置类/XML的位置。如果你的父类PruebaBaseTest没配置这些,就需要在当前类补上:@RunWith(SpringJUnit4ClassRunner.class) @Transactional @WebAppConfiguration // 关键:加载Web应用上下文 @ContextConfiguration(classes = {你的核心Spring配置类.class, Thymeleaf配置类.class}) public class StackOverflowTest extends PruebaBaseTest { // 你的现有代码 }Thymeleaf视图解析器路径配置不匹配
要确保测试环境下Thymeleaf能正确定位到HTML模板。检查你的Thymeleaf配置类里的模板解析器前缀、后缀是否和实际文件位置一致:@Bean public ITemplateResolver templateResolver() { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setApplicationContext(applicationContext); resolver.setPrefix("/WEB-INF/templates/"); // 对应项目中HTML的实际路径,比如src/main/webapp/WEB-INF/templates // 如果是基于Spring Boot风格,路径可能是"classpath:/templates/" resolver.setSuffix(".html"); resolver.setTemplateMode(TemplateMode.HTML); resolver.setCacheable(false); // 测试时关闭缓存,避免修改不生效 return resolver; }重点核对
prefix:如果你的HTML文件在src/main/resources/templates下,前缀要设为"classpath:/templates/";如果在src/main/webapp/WEB-INF/templates下,就用"/WEB-INF/templates/"。MockMvc测试的视图名称匹配错误
如果你用MockMvc测试控制器,要确保控制器返回的视图名称和你预期的一致。比如控制器返回"home",那Thymeleaf会找prefix + "home" + suffix对应的文件。测试代码要验证视图名称:@Autowired private MockMvc mockMvc; @Test public void testControllerView() throws Exception { mockMvc.perform(get("/你的请求路径")) .andExpect(status().isOk()) .andExpect(view().name("home")); // 确保这里的视图名和控制器返回的一致 }Maven资源过滤未包含HTML文件
检查你的pom.xml,确保src/main/resources下的HTML文件能被正确打包到classpath中,否则测试时找不到文件:<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.html</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> </resources> </build>父类setup方法的上下文配置问题
你的测试类继承了PruebaBaseTest,且调用了super.setup(),要确认父类的setup方法没有错误重置上下文,或者遗漏加载Thymeleaf相关配置。可以检查父类是否正确初始化了ApplicationContext,有没有包含视图解析器的配置。
先从这几个点入手排查,应该能解决找不到HTML页面的问题~
内容的提问来源于stack exchange,提问作者Maria

