Spring Boot REST Docs中MockMvc授权测试出现Status 404问题
在使用Spring Boot REST Docs进行MockMvc授权测试时碰到404错误,结合你提供的SmsMessageController代码,我整理了几个核心排查点和解决思路:
验证测试请求路径与控制器映射的一致性
你的控制器标注了@RequestMapping("/luxsms/message"),这意味着所有该控制器的接口都需要以这个完整路径开头。如果测试代码中只写了/message或者拼写错误(比如把luxsms写成luxsm),必然会触发404。确保MockMvc请求使用完整路径,示例代码如下:mockMvc.perform(get("/luxsms/message") .with(httpBasic("username", "password"))) .andExpect(status().isAccepted()) .andDo(document("sms-message-endpoint"));确认测试上下文是否正确加载目标控制器
测试类需要正确配置Spring MVC测试上下文,确保SmsMessageController被加载。如果使用@WebMvcTest,一定要指定目标控制器类;如果用@SpringBootTest,需要确保MockMvc被正确注入。另外,控制器依赖的SmsStatusService、SmsMessageService等Bean,需要用@MockBean在测试类中模拟,避免因依赖缺失导致控制器无法实例化:@ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) @WebMvcTest(SmsMessageController.class) class SmsMessageControllerTest { @Autowired private MockMvc mockMvc; @MockBean private SmsStatusService smsStatusService; @MockBean private SmsMessageService smsMessageService; @MockBean private TaskExecutor taskExecutor; @MockBean private ApplicationContext context; // 测试方法... }排查授权配置是否干扰路径匹配
虽然404是资源未找到,但如果你的项目集成了Spring Security,需要确认授权规则没有拦截目标路径。比如,确保配置了允许访问/luxsms/message(或者要求认证但测试时已携带正确的授权信息)。如果授权规则错误地将该路径排除,也可能导致请求无法到达控制器。检查REST Docs请求构建器的使用
如果你使用了RestDocumentationRequestBuilders来构建请求,要确保路径参数和控制器的映射完全一致,不要额外添加或遗漏前缀。这个构建器和普通的MockMvc请求构建器用法一致,但要注意不要因REST Docs的配置错误导致路径偏差。
另外,你提供的控制器构造函数代码不完整(Appl...),如果是ApplicationContext注入不完整,可能导致控制器无法正常初始化,但这种情况通常会触发启动异常而非404,所以优先级可以靠后排查。
内容的提问来源于stack exchange,提问作者victordeleco2

