Rest 请放心:Isn';难道没有更好的方法来测试一系列结果吗?

Rest 请放心:Isn';难道没有更好的方法来测试一系列结果吗?,rest,rest-assured,rest-assured-jsonpath,Rest,Rest Assured,Rest Assured Jsonpath,我现在正在研究“放心框架” 使用一些API,我得到以下(部分)JSON响应: { "results": [ { "type": "AAAA" }, { "type": "A" } ] } 我正在尝试验证这些类型。 到目前为止,我找到的唯一方法是使用gson将字符串转换为对象,然后断言: @Given("^test2$") public void test2$() {

我现在正在研究“放心框架”

使用一些API,我得到以下(部分)JSON响应:

{
    "results": [
        {
            "type": "AAAA"
        },
        {
            "type": "A"
        }
    ]
}
我正在尝试验证这些类型。 到目前为止,我找到的唯一方法是使用gson将字符串转换为对象,然后断言:

@Given("^test2$")
public void test2$() {

    RestAssured.baseURI = BASE_URI;

    String response =
            given()
            .param(KEY_KEY, API_KEY)
            .param(URL_KEY, URL_TO_CHECK)
            .when()
            .get(RESOURCE)
            .asString();

    System.out.println(response);

    GsonBuilder builder = new GsonBuilder();
    builder.setPrettyPrinting();
    Gson gson = builder.create();
    WhtResponse whtResponse = gson.fromJson(response, WhtResponse.class);

    assertTrue(whtResponse.getResults().size() == 2);
    assertTrue(whtResponse.getResults().get(0).getType().equals("AAAA"));
    assertTrue(whtResponse.getResults().get(1).getType().equals("A"));
}
请忽略一个测试方法中有多个断言。我知道这不是最佳实践,但我现在只是“玩”来学习材料

是否有更好、更短、更流畅的方法来测试这两个值?也许直接使用Rest Assured,而不使用Gson


谢谢

可能有几种方法,但我想介绍一种具体的方法,只使用
重新启动

首先,您可以创建Java类来表示给定的JSON。你可以随时扩展它

创建一个类
ResultsObject
(名称无关紧要)

同样,类名并不重要,重要的是
type
变量名。就像在JSON中一样

现在,通过单行代码,我们可以将JSON(从
响应
字符串
)解析为我们创建的类,如下所示:

List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
ResultsObject results=response.jsonPath().get(“$”,ResultObject.class)

进一步的工作需要创建断言

MatcherAssert.assertThat(types, Matchers.hasItems("AAAA", "A")); //you can use static imports if you'd like.
断言来自
Hamcrest
,该断言已包含在
restassed
中。它将字符串数组与我们选择的字符串数组相匹配

您可以注意到,
类型
尚未初始化。我们需要一个字符串数组,但它是一个
TypeObject
数组。我们可以使用
Java流API
简单地将其转换如下:

List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
我已经测试了解决方案。 它还为您提供了处理数据的灵活性,如您所见,我只使用了一个断言来比较JSON中的所有
类型


希望有帮助

@dushkin没问题。让我知道它是否按您所希望的方式工作:)请记住,在方法
getObject
中,我将
$
作为根插入。如果
results
array在下,例如
query.data
,那么您必须将
$
更改为
query.data
,并且它将工作:)
List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>