我有一个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();
}
答案 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"
}