如何在JUnit测试中验证复杂的JSONObjects?

mem*_*und 5 java junit spring json

如何正确验证a JSONObject中的字段JUnit @Test

{
    "persons": [
        "adults": [
            {
                "name": ".."
                "age": ..
            },
            {
                "name": ".."
                "age": ..
            }
        ]
    ]
}
Run Code Online (Sandbox Code Playgroud)

我的意思是,如果在弹簧管理的Web服务上进行测试,则可以使用jsonPath()如下所示的类似方法:

mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
    .andExpect(jsonPath("$.persons[0].adults[0].name", is("John")));
Run Code Online (Sandbox Code Playgroud)

但是我不是在这里使用Web服务,而是想只验证一个json对象。

我能以某种jsonPath()方式使用弹簧的方法,还是有类似的技术?

gly*_*ing 6

您可以在没有Spring包装的情况下使用Jayway JsonPath

例如:

String json = "{\n" +
        "  \"persons\": [\n" +
        "    {\n" +
        "      \"adults\": [\n" +
        "        {\n" +
        "          \"name\": \"John\",\n" +
        "          \"age\": 25\n" +
        "        },\n" +
        "        {\n" +
        "          \"name\": \"Jill\",\n" +
        "          \"age\": 36\n" +
        "        }\n" +
        "      ]\n" +
        "    }\n" +
        "  ]\n" +
        "}";

DocumentContext documentContext = JsonPath.parse(json);

assertThat(documentContext.read("$.persons[0].adults[0].name"), is("John"));
assertThat(documentContext.read("$.persons[0].adults[1].age"), is(36));
assertThat(documentContext.read("$.persons.length()"), is(1));
assertThat(documentContext.read("$.persons[0].adults.length()"), is(2));
Run Code Online (Sandbox Code Playgroud)

或者,也可以在JsonPath之上使用json-path-assert来添加Hamcrest匹配器,如下所示:

assertThat(json, hasJsonPath("$.persons[0].adults[0].name", is("John")));
assertThat(json, hasJsonPath("$.persons[0].adults[1].age", is(36)));
Run Code Online (Sandbox Code Playgroud)

Maven坐标:

<!-- jayway jsonpath -->
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.3.0</version>
    <scope>test</scope>
</dependency>

<!-- json-path-assert -->
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path-assert</artifactId>
    <version>2.2.0</version>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 2

还有另一种方法可以根据预期值验证 JSON 回复。您可以使用JSONassert

例子:

final MvcResult result = mockMvc.perform(get("/"))
                                .andDo(print())
                                .andExpect(status().isOk())
                                .andReturn();

final String json = result.getResponse().getContentAsString();
final String expected = "{field:'value', anotherField:true}";

JSONAssert.assertEquals(expected, json, true);
Run Code Online (Sandbox Code Playgroud)

JSONassert 提供了多种验证模式,包括自定义比较器。

这是验证 JSON 输出的非常方便的方法。在许多情况下,它显着减少了单元测试类的大小,并为您提供了预期 JSON 对象的可视化表示。