使用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的CredentialValidationPortBean,同时测试类中又用纯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中手动创建的mockCredentialValidationPortBean,避免Bean冲突。 - 测试请求直接写相对路径即可,不需要拼接完整的域名和端口,例如使用
post("/validate/bob")发起请求。
内容的提问来源于stack exchange,提问作者bootlover123
相关产品推荐
相关产品推荐

