用于查找字段顺序的 JSONPath 表达式的匹配器
Matcher for JSONPath expression to find order of fields
我有一个 API,returns 一个 JSON 对象,将显示在 UI 中。对象中字段的顺序很重要,因为 UI 想要按该顺序显示字段。我想编写一个单元测试来确保对象中字段的顺序是正确的。我的 API 回复如下所示:
{
"data": {
"field1": "value1",
"field2": "value2"
}
}
使用 spring boot 的 MockMvc
库,我想写一个这样的表达式来验证字段是否按顺序返回:
.andExpect(jsonPath("$.data"), is("field1=value1, field2=value2")
显然,以上方法不起作用,但我不确定我应该使用哪种类型的 Matcher
来尝试验证字段是否有序。
我找不到比较字段顺序的 Hamcrest 匹配器,但编写自己的匹配器很容易。请注意,JSON 路径表达式的结果将为您提供一个 LinkedHashMap
,因此您所需要的只是一个接受 LinkedHashMap
并将其与给定对象进行比较的匹配器,逐个条目命令。将映射转换为 List
个条目并使用 List
的 equals
方法就可以了,因为 List
将按顺序比较项目。
匹配器的外观如下:
private class OrderedMapMatcher extends BaseMatcher<Map<String, String>> {
private LinkedHashMap<String, String> expected;
public OrderedMapMatcher(LinkedHashMap<String, String> expected) {
this.expected = expected;
}
@Override
public boolean matches(Object o) {
if (!(o instanceof LinkedHashMap)) {
return false;
}
LinkedHashMap actual = (LinkedHashMap) o;
List<Map.Entry<String, String>> expectedList = new ArrayList<>(expected.entrySet());
List actualList = new ArrayList(actual.entrySet());
return expectedList.equals(actualList);
}
@Override
public void describeTo(Description description) {
description.appendText(expected.toString());
}
}
下面是断言的样子:
LinkedHashMap<String, String> expectedData = new LinkedHashMap<>();
expectedData.put("field1", "value1");
expectedData.put("field2", "value2");
// mockMvc ResultActions code would be here
.andExpect(jsonPath("$.data", new OrderedMapMatcher(expectedData)));
我有一个 API,returns 一个 JSON 对象,将显示在 UI 中。对象中字段的顺序很重要,因为 UI 想要按该顺序显示字段。我想编写一个单元测试来确保对象中字段的顺序是正确的。我的 API 回复如下所示:
{
"data": {
"field1": "value1",
"field2": "value2"
}
}
使用 spring boot 的 MockMvc
库,我想写一个这样的表达式来验证字段是否按顺序返回:
.andExpect(jsonPath("$.data"), is("field1=value1, field2=value2")
显然,以上方法不起作用,但我不确定我应该使用哪种类型的 Matcher
来尝试验证字段是否有序。
我找不到比较字段顺序的 Hamcrest 匹配器,但编写自己的匹配器很容易。请注意,JSON 路径表达式的结果将为您提供一个 LinkedHashMap
,因此您所需要的只是一个接受 LinkedHashMap
并将其与给定对象进行比较的匹配器,逐个条目命令。将映射转换为 List
个条目并使用 List
的 equals
方法就可以了,因为 List
将按顺序比较项目。
匹配器的外观如下:
private class OrderedMapMatcher extends BaseMatcher<Map<String, String>> {
private LinkedHashMap<String, String> expected;
public OrderedMapMatcher(LinkedHashMap<String, String> expected) {
this.expected = expected;
}
@Override
public boolean matches(Object o) {
if (!(o instanceof LinkedHashMap)) {
return false;
}
LinkedHashMap actual = (LinkedHashMap) o;
List<Map.Entry<String, String>> expectedList = new ArrayList<>(expected.entrySet());
List actualList = new ArrayList(actual.entrySet());
return expectedList.equals(actualList);
}
@Override
public void describeTo(Description description) {
description.appendText(expected.toString());
}
}
下面是断言的样子:
LinkedHashMap<String, String> expectedData = new LinkedHashMap<>();
expectedData.put("field1", "value1");
expectedData.put("field2", "value2");
// mockMvc ResultActions code would be here
.andExpect(jsonPath("$.data", new OrderedMapMatcher(expectedData)));