当前位置: 首页 > 知识库问答 >
问题:

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

慕容雅珺
2023-03-14

我现在正在研究放心框架。

使用一些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"));
}

请忽略一种测试方法中有几个断言。我知道这不是最佳实践,但我现在只是“玩”来学习材料。

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

谢谢!

共有1个答案

梁浩涆
2023-03-14

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

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

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

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

我们声明重新发行的必须寻找JSON对象的JSON数组。这些对象中的每一个都被解析为类型对象(这个名称也无关紧要)。重要的是结果变量名。它匹配JSON中的结果。

因此,现在我们必须创建类来表示每个JSON对象。

public class TypeObject {
    public String type;
}

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

现在,只需一行代码,我们就可以将JSON(从响应String解析为我们创建的类,如下所示:

结果对象结果=response.json路径(). get("$", ResultObject.class);

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

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

断言来自Hamcrest,该断言已包含在重新假设中。它将字符串数组与我们选择的字符串数组相匹配。

您可以注意到,类型尚未初始化。我们需要一个字符串数组,但它是一个类型对象数组。我们可以简单地使用如下方式转换它:

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

就这样。

但是,如果出现这样的异常,则无法反序列化对象,因为在类路径中找不到JSON反序列化器。请将Jackson(Databind)或Gson放在类路径中

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

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

希望有帮助!

 类似资料:
  • 除了把它们全部输入外,还有没有更好的方法在字符串中列出它们?

  • 除了把它们全部输入外,还有没有更好的方法在字符串中列出它们?

  • 假设我有一个用户模式/模型,用户有一个朋友列表。Mongoose希望您将好友列表(外键/ObjectID类型)存储为数组,对吗?这意味着如果我想通过ID找到我的朋友,Mongoose将搜索数组,直到找到具有我想要的ID的朋友的第一个实例。那似乎真的是时间低效,不是吗?有更好的办法吗?

  • 问题内容: 是否有一个很好的方法来Map 获取和忽略案件? 问题答案: TreeMap扩展了Map并支持自定义比较器。 字符串提供默认的不区分大小写的比较器。 所以: 比较器不考虑区域设置。在其JavaDoc中阅读有关它的更多信息。

  • 我做这个迭代是为了对DataFrame的每个值执行不同的函数: 作为xxx一个2列数据帧

  • 我被要求为一个临时雇佣系统做一个顺序图,其中主要包括申请者、雇主和系统。按照我的用例和类图,我使用了我必须的信息,为我被分配为actor的申请者生成一个序列图。我的老师想出了以下的评语: 帧只能是alt、opt或Loop。在同一活动栏中不能有多个箭头。看起来申请人和雇主都是人。序列图是软件的,而不是人类的。左边的驱动程序方法没有方法名。软件“系统”只有一个参与者。你需要有许多参与者,每一个是一个班