MockMvc JsonPath结果匹配器与单个值不匹配

时间:2017-02-16 15:19:13

标签: java jsonpath mockmvc

我正在为我的REST API控制器编写测试,我需要从返回的UUID对象中检查JSON值,请参阅此测试方法:

@Test
public void findById() throws Exception {

    final String uuidString = "6c2b1c8a-3c29-4160-98b0-b8eaea7ea4d1";
    final UUID id = UUID.fromString(uuidString);
    final Envelope envelope = createEnvelope(id);

    when(envelopeService.findOne(id, currentUser)).thenReturn(Optional.of(envelope));
    when(utilService.getLoggedInUser()).thenReturn(currentUser);

    mockMvc.perform(get("/api/envelopes/{id}", uuidString)).
            andExpect(status().isOk()).andExpect(content().contentType(Util.APPLICATION_JSON_UTF8))
            .andExpect(jsonPath("$..id", is(uuidString)));

    verify(envelopeService, times(1)).findOne(id, currentUser);
    //verifyNoMoreInteractions(envelopeService);

}

但测试会产生此错误:

 Expected: is "6c2b1c8a-3c29-4160-98b0-b8eaea7ea4d1"
         but: was <["6c2b1c8a-3c29-4160-98b0-b8eaea7ea4d1"]>
        at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
        at org.springframework.test.util.JsonPathExpectationsHelper.assertValue(JsonPathExpectationsHelper.java:74)
        at org.springframework.test.web.servlet.result.JsonPathResultMatchers$1.match(JsonPathResultMatchers.java:86)
        at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171)

ID 6c2b1c8a-3c29-4160-98b0-b8eaea7ea4d1似乎正确返回,但序列化为不同的结构。

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

正如我所看到的,jsonPath变量是一个对象数组,而不是一个String。

您应该使用$[0]来获取您的案例中第一个也是唯一一个UUID元素:

mockMvc.perform(get("/api/envelopes/{id}", uuidString)).
            andExpect(status().isOk())
            .andExpect(content().contentType(Util.APPLICATION_JSON_UTF8))
            .andExpect(jsonPath("$[0]", is(uuidString))); 

答案 1 :(得分:0)

原因是您的jsonpath声明错误

"6c2b1c8a-3c29-4160-98b0-b8eaea7ea4d1"  <--- String
<["6c2b1c8a-3c29-4160-98b0-b8eaea7ea4d1"]> <--- Array

你不应该使用$..id,这会给你一个阵列。在此处查看文档https://github.com/jayway/JsonPath