用于查找字段顺序的 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 个条目并使用 Listequals 方法就可以了,因为 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)));