首页 > 解决方案 > 放心:难道没有更好的方法来测试一系列结果吗?

问题描述

我现在正在研究 Rest Assured 框架。

使用一些 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?

谢谢!

标签: restrest-assuredrest-assured-jsonpath

解决方案


可能有几种方法,但我想介绍一种特定的方法,仅使用RestAssured.

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

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

public class ResultsObject {
    public List<TypeObject> results;
}

我们声明RestAssured必须查找 JSON 对象的 JSON 数组。这些对象中的每一个都被解析为TypeObject(这个名称也无关紧要)。重要的是results变量名。它与resultsJSON 中的 匹配。

所以,现在我们必须创建TypeObject类来表示每个 JSON 对象。

public class TypeObject {
    public String type;
}

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

现在,只需一行代码,我们就可以将 JSON(来自ResponseString)解析为我们创建的类,如下所示:

ResultsObject results = response.jsonPath().get("$", ResultObject.class);

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

MatcherAssert.assertThat(types, Matchers.hasItems("AAAA", "A")); //you can use static imports if you'd like.

断言来自Hamcrest其中已包含在RestAssured. 它将字符串数组与我们选择的字符串数组匹配。

您可以注意到,它types尚未初始化。我们需要一个字符串数组,但它是一个TypeObject. 我们可以Java Stream API像这样简单地转换它:

List<String> types = resultsObject.results.stream().map(x -> x.type).collect(Collectors.toList());

就是这样!

但是,如果你得到这样的异常,Cannot deserialize object because no JSON deserializer found in classpath. Please put either Jackson (Databind) or Gson in the classpath.你所要做的就是添加jackson-databind到 Maven。Rest Assured 能够使用GsonJackson数据绑定将 JSON 转换为 Java 类。您所需要的只是依赖关系,一切就绪。

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>

我已经测试了解决方案。它还为您提供了处理数据的灵活性,并且如您所见,我只使用了 1 个断言来比较typeJSON 中的所有 s。

希望能帮助到你!


推荐阅读