我正在使用JUnit编写单元测试,我想知道是否有办法对其进行assertEquals
比较。
我想要比较两个JsonElement类,但我想忽略JSON中数组属性中的一个字段。
我的JSON看起来像这样:
{
"name":"Jon",
"arrayProps":[
{
"careAbout":"123",
"doNotCareAbout":"blablabla"
},
{
"careAbout":"456",
"doNotCareAbout":"blablabla"
},
{
"careAbout":"789",
"doNotCareAbout":"blablabla"
}
]
}
我想比较除doNotCareAbout元素之外的所有字段。当我打电话时,这可能与GSON有关:
JsonElement element1 = ...;
JsonElement element2 = ...;
assertEquals(element1, element2);
如果不是,有人可以推荐一个合适的库,在那里我可以进行这种比较,我想排除一些元素吗?
答案 0 :(得分:1)
您可以改为忽略该元素来编写自定义比较器(或覆盖compareTo
),并验证assertEquals(compare(element1, element2), 0);
或assertEquals(element1.compareTo(element2), 0);
。因为你只是想看看它们是否相等,所以很容易迭代元素。
最好使用比较器,这样就不会用特定于测试的东西来污染你的对象。
答案 1 :(得分:1)
您可以从“arrayProps”数组中的每个元素中删除“doNotCareAbout”属性,如下所示:
JsonObject jsonObject = (JsonObject) element;
JsonArray arrayProps = (JsonArray) jsonObject.get("arrayProps");
for (JsonElement arrayProp : arrayProps) {
JsonObject arrayPropObject = (JsonObject) arrayProp;
arrayPropObject.remove("doNotCareAbout");
}
System.out.println(jsonObject); // prints {"name":"Jon","arrayProps":[{"careAbout":"123"},{"careAbout":"456"},{"careAbout":"789"}]}
执行此操作后,您应该能够以您想要的方式比较JsonElements。
或者,您可以使用json-path库来提取您想要比较的属性:
String name = JsonPath.read(json, "$.name");
System.out.println(name); // prints Jon
List<String> careAboutProps = JsonPath.read(json, "$.arrayProps[*].careAbout");
System.out.println(careAboutProps); // prints ["123","456","789"]
但是,如果“arrayProps”的真实元素具有很多属性并且您只想排除其中的一些属性,那么这可能是不可行的。