用于测试 JSON 输出的 JsonPath 替代方案

问题描述 投票:0回答:1

我正在为一个函数编写一些测试,该函数接受一些用户提供的数据并返回基于模板的 JSON 字符串。到目前为止,我只是进行断言,将整个输出字符串与“预期”json 文档进行比较。它有效,但测试很脆弱。对输出的任何更改都需要更新预期文档,即使更改与正在测试的内容无关。

我应该做的是针对 json 输出的特定部分进行断言,但我正在努力寻找一个可以实现我想要的功能的库。 JsonPath 可以完成工作,但语法很笨拙。我知道我想要测试的特定数据在哪里,但尝试制作精确的 JsonPath 查询字符串来检索它是一个耗时的过程。

我希望找到一个库,它允许我向 json 元素添加“标签”注释,我可以在测试中使用它来获取我需要的确切数据。比如:

            {
                "elementType": "formInputHidden",
                "name": "message_id",
                "value": "274"
            },
            {
              "elementType": "formInputHidden",
              "name": "message_status",
              "value": "PENDING_MODERATOR_APPROVAL"
            }

然后在我的测试中我可以进行如下查找:

Object result = jsonFind.get(jsonOutput, "name", "message_id");
//result="274"

有这样的事情存在吗?

java json unit-testing jsonpath
1个回答
0
投票

您可以尝试图书馆Josson & Jossons

https://github.com/octomix/josson

乔森查询

对应的Josson查询很简单。

Josson jossonData = Josson.fromJsonString(
    "[" +
    "    {" +
    "        \"elementType\": \"formInputHidden\"," +
    "        \"name\": \"message_id\"," +
    "        \"value\": \"274\"" +
    "    }," +
    "    {" +
    "        \"elementType\": \"formInputHidden\"," +
    "        \"name\": \"message_status\"," +
    "        \"value\": \"PENDING_MODERATOR_APPROVAL\"" +
    "    }" +
    "]");
System.out.println(jossonData.getString("[name='message_status'].value"));
// Output: PENDING_MODERATOR_APPROVAL

乔森声明

Jossons支持多个数据集操作。因此,语句中需要数据集名称限定符。

Jossons jossons = new Jossons();
jossons.putDataset("json", jossonData);
JsonNode node = jossons.evaluateStatement("json->[name='message_status'].value");
System.out.println(node.toPrettyString());
// Output: PENDING_MODERATOR_APPROVAL

动态乔森斯声明

将评估标准更改为占位符。

jossons.putDataset("k", new TextNode("name"));
jossons.putDataset("v", new TextNode("message_status"));
System.out.println(jossons.fillInPlaceholder("{{json->[{{k}}={{v->q()}}].value}}"));
// Output: PENDING_MODERATOR_APPROVAL
© www.soinside.com 2019 - 2024. All rights reserved.