【问题标题】:RestAssured: get key value from json object with specified valueRestAssured:从具有指定值的 json 对象中获取键值
【发布时间】:2021-03-12 17:04:14
【问题描述】:

在一个测试用例中,我使用以下响应执行调用:

[
    {
        "ourID": "770050010000000010",
        "date": "2019-03-07",
        "otherValue": null
    },
    {
        "ourID": "770050010000000020",
        "date": "2019-03-07",
        "otherValue": null
    }
]

测试由 Serenity 执行,我使用 RestAssured 执行调用:

Response response = RestAssuredApiHelper.baseRestCall(headers, baseUrl, path)
                .body(requestBody)
                .post();

assertThat(response.getBody().jsonPath().get("$.[?(@.ourID=='770050010000000010')].date"), contains("2019-03-07"));

断言不起作用,可能是因为 RestAssured 使用 Gpath 而不是 JsonPath,但在我读过的所有文档中,都有一些可行的方法示例。 我在这里错过了什么?

我得到的错误是:

java.lang.IllegalArgumentException: Invalid JSON expression:
Script1.groovy: 1: unexpected token: [ @ line 1, column 29.
                            $.[?(@.meteringPointEANID=='770050010000000010')].energySource
                               ^

1 error

【问题讨论】:

  • 接受以下任何对您有帮助的答案,以便对其他人有所帮助

标签: java rest-assured serenity-bdd rest-assured-jsonpath


【解决方案1】:
assertEquals(response.path("find {it.ourID == '770050010000000010'}.date"), "2019-03-07")

【讨论】:

    【解决方案2】:

    将 JsonPath 与 RestAssured 一起使用的另一种方法是使用 RestAssured 的内置反序列化机制。

    如果你不知道对象的返回类型是什么,你可以看看这个: https://github.com/rest-assured/rest-assured/wiki/usage#deserialization-with-generics

    通用解决方案如下所示:

    Response response = RestAssuredApiHelper.baseRestCall(headers, baseUrl, path)
                    .body(requestBody)
                    .post();
    
    List<Map<String, Object>> objects =  response.getBody().as(new TypeRef<>() {});
    Map<String, Object> singleObject = objects.stream().filter((Map<String, Object> object) -> object.get("ourID").equals("770050010000000010"))
                    .peek(System.out::println)
                    .findFirst().get();
    
    System.out.println(singleObject.get("ourID")); // 770050010000000010
    

    如果你知道响应对象是什么,那就更简单了:

    List<YourResponseObject> yourResponseObjects = response.getBody().as(new TypeRef<>() {});
    

    【讨论】:

      【解决方案3】:

      检查以下代码:--(我认为json表达式是正确的,没有检查)

      Object dateObject = JsonPath.parse(response.getBody().asString()).read("$.[?(@.ourID=='770050010000000010')].date");
      String dateString = dataObject.toString();
      assertThat(dateString, containsString("2019-03-07"));
      

      POM 依赖:---

      <!-- https://mvnrepository.com/artifact/com.jayway.jsonpath/json-path -->
      <dependency>
          <groupId>com.jayway.jsonpath</groupId>
          <artifactId>json-path</artifactId>
          <version>2.1.0</version>
      </dependency>
      

      【讨论】:

      • 第一行显示这个错误:方法 parse(String) is undefined for the type JsonPath
      • 添加了依赖检查
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2022-01-21
      相关资源
      最近更新 更多