Spring Cloud Contract测试报错:预期200实际返回404求助
问题诊断与修复
你的测试返回404而非预期200的核心原因是Controller的@RequestMapping中headers参数配置错误,导致Contract生成的请求无法匹配到对应的接口方法。
具体问题分析
看你的ServerDefaultController映射配置:
@RequestMapping(value = controllerPath, headers={"application/json"})
这里的headers={"application/json"}写法不符合Spring MVC的规则——headers参数需要以"HeaderName=HeaderValue"的格式,用来匹配请求中指定Header的对应值。而你直接写"application/json",意味着只有当请求中存在一个名为application/json的Header(不管值是什么)时,才会匹配这个Controller方法。
但你的Contract定义的请求是设置Content-Type为application/json:
headers { contentType(applicationJson()) }
这会生成包含Content-Type: application/json的请求,而非一个名为application/json的Header,所以请求无法匹配到Controller方法,自然返回404。
修复方案
修改ServerDefaultController的@RequestMapping配置,改成正确的格式:
方式1:使用headers参数明确匹配Content-Type
import org.springframework.http.MediaType; @RequestMapping(value = controllerPath, headers = "Content-Type=" + MediaType.APPLICATION_JSON_VALUE)
方式2:使用consumes参数(推荐,语义更清晰)
import org.springframework.http.MediaType; @RequestMapping(value = controllerPath, consumes = MediaType.APPLICATION_JSON_VALUE)
额外验证确认
- 你的
ContractdemoserverBase中setup方法已经正确用RestAssuredMockMvc.standaloneSetup(new ServerDefaultController())初始化了Controller,且你已确认该方法被调用,这部分无问题。 - Contract中定义的
url '/test'与Controller的controllerPath完全一致,路径匹配无问题。
修改后重新运行测试,应该就能得到预期的200状态码了。
内容的提问来源于stack exchange,提问作者MuffinMan
相关产品推荐
相关产品推荐

