2

我正在尝试使用 jsonPath 放心地从 JSON 数组中提取值。

示例 JSON 响应:

{
    "notices": [],
    "errors": [
        {
            "code": "UNAUTHORIZED"
        }
    ]
}

当前测试如下:

@Test(dataProvider = "somePayLoadProvider", dataProviderClass = MyPayLoadProvider.class)
public void myTestMethod(SomePayload myPayload) {
    Response r = given().
            spec(myRequestSpecification).
            contentType(ContentType.JSON).
            body(myPayload).
            post("/my-api-path");

    List<String> e = r.getBody().jsonPath().getList("errors.code");
    assertEquals(e, hasItem(MyErrorType.UNAUTHORIZED.error()));
}

但是,我一直在我的错误代码周围得到 []。我只是想要它的价值。

java.lang.AssertionError: expected 
[a collection containing "UNAUTHORIZED"] but found [[UNAUTHORIZED]]

Expected :a collection containing "UNAUTHORIZED"
Actual   :[UNAUTHORIZED]
4

3 回答 3

2

或者,您可以指定“错误”的数组索引以删除方括号。IE:

    List<String> e = r.getBody().jsonPath().getList("errors[0].code");

然后您可以返回使用“等于”而不是“包含”

于 2019-03-14T08:33:50.210 回答
1

有了放心,您还可以像这样在 REST 调用中进行链式断言:

given()
  .spec(myRequestSpecification)
  .contentType(ContentType.JSON)
  .body(myPayload)
  .post("/my-api-path") //this returns Response
  .then()               //but this returns ValidatableResponse; important difference
  .statusCode(200)
  .body("notices", hasSize(0)) // any applicable hamcrest matcher can be used
  .body("errors", hasSize(1))
  .body("errors", contains(MyErrorType.UNAUTHORIZED.error()));
于 2019-08-14T20:10:16.733 回答
0

显然这只是我没有assert()正确使用方法。

改变了

assertEquals(e, hasItem(MyErrorType.UNAUTHORIZED.error()));

assertTrue(e.contains(MyErrorType.UNAUTHORIZED.error()));

json的解析正确地完成了ArrayList<String>

于 2017-07-27T02:24:16.167 回答