3

我正在使用 Spring 的“spring-test-mvc”库来测试 Web 控制器。我有一个非常简单的控制器,它返回一个 JSON 数组。然后在我的测试中我有:

@Test
public void shouldGetAllUsersAsJson() throws Exception {
    mockMvc.perform(get("/v1/users").accept(MediaType.APPLICATION_JSON))
            .andExpect(content().mimeType(MediaType.APPLICATION_JSON))
            .andExpect(jsonPath("fName").exists());
}

上面的测试返回:

java.lang.AssertionError: No value for JSON path: fName

为了快速检查我实际得到的结果,我运行了以下测试:

@Test
public void shouldPrintResults() throws Exception {
    mockMvc.perform(get("/v1/users").accept(MediaType.APPLICATION_JSON))
            .andDo(print());
}

它在正文中返回正确的 JSON 数组MockHttpServletResponse

我不确定为什么jsonPath无法fName在 JSON 数组中看到。

4

2 回答 2

10

如果您将 json 路径依赖项添加到 maven,或者将 jar 添加到您的 lib,那么它将起作用。我认为 Spring 在最新的 Spring 3.2.0 RC1 版本中不包括 jsonPath 依赖项。我猜这对于 Spring-Test-MVC 独立项目也是一样的。

这是 Maven 的依赖项:

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

您可能还需要 hamcrest 库来使用 jsonPath("$.test").value("test")

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
于 2012-11-13T15:57:59.210 回答
10

你的 json 响应体是什么样的?您可以通过执行.andDo(print())

你可能想试试jsonPath("$.fName")

这是假设您的 json 响应是: {"fName":"first name"}

如果您的响应是一个数组,那么您需要jsonPath("$[0].fName")一个响应,例如: [{"fName":"first name"},{"fName":"first name #2"}]

您可以在以下位置查看更多示例: http: //goessner.net/articles/JsonPath/

于 2012-11-13T21:52:31.370 回答