我正在为一个函数编写一些测试,该函数接受一些用户提供的数据并返回基于模板的 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"
有这样的事情存在吗?
您可以尝试图书馆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