You need to enable JavaScript to run this app. 使用Junit5测试Spring Boot Controller时接口返回404的问题排查
优惠活动
大模型
产品
解决方案
定价
更多

使用Junit5测试Spring Boot Controller时接口返回404的问题排查

404问题的根本原因
  • 核心致命错误:MockMvcBuilders.standaloneSetup()用法完全错误
    这个方法的设计用途是直接传入待测试的Controller实例,手动完成路由注册。你给方法传入的是一个@Mock修饰的WebApplicationContext对象,这个mock对象内部没有任何真实的接口路由配置,MockMvc初始化完成后路由表是空的——不管你把请求路径写得多正确,都会因为找不到匹配的处理器返回404,这也是你反复调整请求URL都无法解决问题的本质原因。
  • 测试上下文完全割裂
    你已经通过@WebMvcTest引入了Spring MVC切片测试的自动配置,本来应该由Spring自动加载指定的Controller、装配TestConfig中的Mapper Bean、初始化内置MockMvc。但你手动构建了独立的MockMvc实例,完全绕开了Spring的上下文装配流程,TestConfig中注册的所有Bean都和你实际发请求用的MockMvc没有关联。
  • Mock对象装配逻辑冲突
    你在TestConfig中手动注册了一个mock的CredentialValidationPort Bean,同时测试类中又用纯Mockito的@Mock注解定义了同类型字段。但因为自定义的MockMvc根本没走Spring的依赖注入流程,这两个mock都无法正确注入到Controller的依赖中,就算解决了404问题,后续也会出现打桩不生效、空指针等问题。
正确的修正方向
  • 删除@Mock修饰的WebApplicationContext字段,删除自定义的setup()方法、手动构建MockMvc的逻辑,直接用@Autowired注入Spring自动配置好的MockMvc实例即可,不需要手动调用MockMvcBuilders搭建。
  • 将测试类中纯Mockito的@Mock private CredentialValidationPort credentialValidationPort替换为Spring测试框架提供的@MockBean注解,让Spring自动将这个mock对象注册到测试上下文中替换真实依赖,同时删掉TestConfig中手动创建的mockCredentialValidationPort Bean,避免Bean冲突。
  • 测试请求直接写相对路径即可,不需要拼接完整的域名和端口,例如使用post("/validate/bob")发起请求。

内容的提问来源于stack exchange,提问作者bootlover123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 10:45:02