测试带PathSegment路径参数的POST请求出现断言失败该如何解决
问题根源
你的测试用例存在两处明确问题,是导致404和断言失败的核心原因:
- Rest Assured默认开启URL编码,且会自动识别路径中
;开头的矩阵参数,将其从路径中剥离单独处理,导致实际发往服务端的路径为/api/customer/order/1002/items/qty,和你定义的接口路径规则不匹配,因此返回404。 - 你的断言逻辑写反:如果接口正常处理请求后返回
Order(s) Received,assertNotEquals会直接抛出断言失败错误。
修复方案
方案1:关闭URL编码(最简便)
新增urlEncodingEnabled(false)配置,让Rest Assured原样传递你写入的完整路径:
@Test public final void testOrderMultipleItems() throws URISyntaxException, AssertionError { String msg= given() .urlEncodingEnabled(false) .contentType("application/json") .when() .post(TestUtil.getURI("/api/customer/order/1002/items;item=3006;item=3005/qty;q=1;q=1")) .getBody().asString(); assertEquals("Order(s) Received", msg); }
方案2:显式传递路径参数
如果不想全局关闭URL编码,也可以通过路径参数的方式传递带矩阵参数的路径段:
@Test public final void testOrderMultipleItems() throws URISyntaxException, AssertionError { String msg= given() .contentType("application/json") .pathParam("id", 1002) .pathParam("itemSegment", "items;item=3006;item=3005") .pathParam("qtySegment", "qty;q=1;q=1") .when() .post(TestUtil.getURI("/api/customer/order/{id}/{itemSegment}/{qtySegment}")) .getBody().asString(); assertEquals("Order(s) Received", msg); }
调试建议
后续遇到类似请求异常问题,可以在given后添加.log().all()配置,打印完整的请求信息(路径、头、参数等),快速定位请求和预期不一致的地方:
given().log().all() // 剩余配置
内容的提问来源于stack exchange,提问作者Pallavi Prasad
相关产品推荐
相关产品推荐

