Rest Assured:从Response List中提取值

时间:2017-07-31 13:14:48

标签: java rest-assured

我有一个List作为回复返回。我需要使用product.name和tariffPlan.name从列表中获取一个项目。

    [
  {
    "id": 123,
    "product": {
      "id": 1,
      "code": "credit",
      "name": "Credit"
    },
    "tariffPlan": {
      "id": 1,
      "code": "gold",
      "name": "Gold"
    }
  },
  {
    "id": 234,
    "product": {
      "id": 2,
      "code": "debit",
      "name": "Debit"
    },
    "tariffPlan": {
      "id": 1,
      "code": "gold",
      "name": "Gold"
    }
  }
]

我使用Java8。这是我的方法。我得到了Card.class元素列表。然后我需要从列表中获取具有指定“product.name”和“tariffPlan.name”的单个项目。

public List<Card> getCardId(String productName, String tariffPlanName) {
    return given()
        .param("product.name", productName)
        .param("tariffPlan.name", tariffPlanName)
        .when().get("/").then()
        .extract().jsonPath().getList("", Card.class);
  }

是否可以使用restAssured进行操作?也许在我的例子中使用.param方法?但在我的例子中,.param方法被忽略了。谢谢你的想法。

UPD。我的决定是:

 public Card getCard(String productName, String tariffPlanName) {
    List<Card> cardList = given()
        .when().get("/").then()
        .extract().jsonPath().getList("", Card.class);

    return cardList.stream()
        .filter(card -> card.product.name.equals(productName))
        .filter(card -> card.tariffPlan.name.equals(tariffPlanName))
        .findFirst()
        .get();
  }

4 个答案:

答案 0 :(得分:0)

实际上,您可以......但是如果您尝试执行以下操作,则需要处理默认映射器的反序列化问题:

.extract().jsonPath().getList("findAll {it.productName == " + productName + "}", Card.class);

您将无法将HashMap转换为您的对象类型。这是因为在路径中使用gpath表达式默认情况下在键上没有双引号提供json。所以你需要用它来美化它(你可以把它放在RestAssured默认值中):

.extract().jsonPath().using((GsonObjectMapperFactory) (aClass, s) -> new GsonBuilder().setPrettyPrinting().create())

结果你可以投射出类似的东西:

.getObject("findAll {it.productName == 'productName'}.find {it.tariffPlanName.contains('tariffPlanName')}", Card.class)

参见完整示例:

import com.google.gson.GsonBuilder;
import io.restassured.http.ContentType;
import io.restassured.mapper.factory.GsonObjectMapperFactory;
import lombok.Data;
import org.testng.annotations.Test;

import java.util.HashMap;
import java.util.List;

import static io.restassured.RestAssured.given;

public class TestLogging {

    @Test
    public void apiTest(){
        List<Item> list = given()
                .contentType(ContentType.JSON)
                .when()
                .get("https://jsonplaceholder.typicode.com/posts")
                .then().log().all()
                .extract().jsonPath().using((GsonObjectMapperFactory) (aClass, s) -> new GsonBuilder().setPrettyPrinting().create())
                .getList("findAll {it.userId == 6}.findAll {it.title.contains('sit')}", Item.class);
        list.forEach(System.out::println);
    }

    @Data
    class Item {
        private String userId;
        private String id;
        private String title;
        private String body;
    }
}

答案 1 :(得分:0)

如果您需要从响应json列表中获取值,这里有什么对我有用:

Json sample:
[
  {
    "first": "one",
    "second": "two",
    "third": "three"
  }
]

Code:

String first =
given
  .contentType(ContentType.JSON)
.when()
  .get("url")
.then()
.extract().response().body().path("[0].first")

答案 2 :(得分:0)

假设您要获取id的值,而产品名称是“ Credit”,而riffingPlan是“ Gold”。

使用

from(get(url).asString()).getList("findAll { it.product.name == 'Credit' && it.tariffPlan.name == 'Gold'}.id");

其中url-http / https请求和get(url).asString()将以字符串形式返回JSON响应。

答案 3 :(得分:0)

这是一个 kotlin 示例:

    @Test
    fun `creat endpoint with invalid payload should return 400 error`() {
        val responseError: List<ErrorClass> = Given {
            spec(requestSpecification)
            body(invalidPayload)
        } When {
            post("/endpoint")
        } Then {
            statusCode(HttpStatus.SC_BAD_REQUEST)
        } Extract {
            body().`as`(object : TypeRef<List<ErrorClass>>() {})
        }

        responseError shouldHaveSize 1
        responseError[0].field shouldBe "xxxx"
        responseError[0].message shouldBe "xxx"
    }