在 PathParam 中使用 PathSegment 测试 POST 请求时断言失败

Posted

技术标签:

【中文标题】在 PathParam 中使用 PathSegment 测试 POST 请求时断言失败【英文标题】:Assertion failure when testing POST request with PathSegment in PathParam 【发布时间】:2021-10-20 20:11:29 【问题描述】:

我有一个需要多个条目的 REST API POST 请求。这些条目是使用 PathSegment 提取的。 API 正在工作,但是当我使用 Rest Assured 编写测试用例时,我遇到了断言失败。我将 JAX-RS 和 Jersey 用于 API。

我已经通过 SO 和其他一些论坛寻求答案,但没有令人满意的答案。

我的 REST API 代码是:

  @Produces(MediaType.APPLICATION_JSON)
  @Path("/order/id/var1: items/var2: qty")
  public final String orderMultipleItems(@PathParam("var1") final PathSegment itemPs, @PathParam("var2") final PathSegment qtyPs,
      @PathParam("id") final int id) 
    HashMap<Integer, Integer> items = new HashMap<Integer, Integer>();

    //rest of the code

这是我放心的代码:

@Test
  public final void testOrderMultipleItems() throws URISyntaxException, AssertionError 
    String msg= given().contentType("application/json").when()
        .post(TestUtil.getURI("/api/customer/order/1002/items;item=3006;item=3005/qty;q=1;q=1"))
        .getBody().asString();
    assertNotEquals("Order(s) Received", msg);
  

我在测试时得到 404,但当我通过 curl 运行 POST 请求时得到 200。我是否在我的发布请求的测试用例中犯了错误?

任何建议都将不胜感激。

【问题讨论】:

【参考方案1】:

当您使用 curl 向服务器发送请求 URI 时,它会按原样提交:

http://localhost/api/customer/order/1002/items;item=3006;item=3005/qty;q=1;q=1

但是,当您通过 RestAssured(使用 post)发送 URI 时,RestAssured 会将特殊字符 ';' 编码为 '%3B' 和 '=' 到 '%3D' 并且请求 URI 变成这样:

http://localhost/api/customer/order/1002/items%3Bitem%3D3006%3Bitem%3D3005/qty%3Bq%3D1%3Bq%3D1

服务器无法理解。这就是问题所在。

因此,您可以在发送请求之前使用以下代码来避免这种情况,

RestAssured.urlEncodingEnabled = false;

希望这能解决您的问题。

【讨论】:

以上是关于在 PathParam 中使用 PathSegment 测试 POST 请求时断言失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 @pathparam 和 @requestmapping 获取 null

何时使用 @QueryParam 与 @PathParam

将来自 REST 调用的 @PathParam 值存储在列表或数组中

根据 JAX-RS 中的规范使用带有 @PathParam 的 PathSegment?

@RequestParam,@PathParam,@PathVariable,@QueryParam注解的使用区别

Jax-RS 中的可选 @PathParam