You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot配置server.servlet.context-path=/后集成测试访问根路径无法返回index.html

解决Spring Boot集成测试中根路径返回404的问题

我之前也碰到过一模一样的情况——实际运行时访问/能正常拿到index.html,但用MockMvc测试就报404,折腾了好一会儿才找到症结,咱们一步步来解决:

核心原因:测试注解的选择问题

如果你用的是@WebMvcTest写测试,那大概率是这个注解的锅。@WebMvcTest是专门用来测试控制器逻辑的轻量级注解,它只会加载和MVC相关的Bean(比如控制器、参数转换器这些),但不会加载静态资源的自动配置,也不会启动完整的应用上下文。而index.html属于静态资源,自然在这种测试环境下找不到。

解决方案:换成完整集成测试配置

把测试类上的@WebMvcTest换成@SpringBootTest加上@AutoConfigureMockMvc,这样Spring Boot会启动完整的应用上下文,包括静态资源的映射规则,就能和实际运行环境保持一致了。

举个修改后的测试代码例子:

@SpringBootTest
@AutoConfigureMockMvc
public class HomePageIntegrationTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void rootPathShouldReturnIndexHtml() throws Exception {
        mockMvc.perform(get("/"))
               .andExpect(status().isOk())
               // 可以额外验证返回的是HTML类型
               .andExpect(content().contentTypeCompatibleWith(MediaType.TEXT_HTML));
    }
}

额外检查点

如果换了注解还是有问题,再排查这几个点:

  • 确认index.html放在了正确的位置:Spring Boot默认会从src/main/resources/staticsrc/main/resources/public或者src/main/resources/resources目录加载静态资源,别放错地方了。
  • 检查application.properties里的server.servlet.context-path=/是否真的被测试环境加载:@SpringBootTest默认会读取src/main/resources/application.properties,如果有测试专用的application-test.properties,也要确保里面的配置一致。
  • 如果你自定义了WebMvcConfigurer来修改资源映射规则,确保这个配置类在测试环境中被正确加载(@SpringBootTest会自动扫描所有配置类,所以一般没问题)。

这样调整之后,你的测试应该就能和实际运行环境一样,正常返回index.html了。

内容的提问来源于stack exchange,提问作者Yaniv K.

火山引擎 最新活动