2017-02-16 71 views
1

我写我的REST API控制器测试,我需要从返回JSON对象检查UUID值,请参阅该测试方法:MockMvc JsonPath结果匹配不匹配的单值

@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返回正确,但在序列化到不同的结构。

我的代码有什么问题?

+0

您可以发布impl。的api .. – Jaiwo99

+0

这与具体实施无关。我需要知道如何检查返回的UUID值等于我的值。 – Artegon

回答

0

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

您应该使用$[0]让你的情况第一和唯一的元素,这就是UUID:

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

的原因是你的jsonpath声明是错误的

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

,你不应该使用$..id,它给你一个阵列回来。在此处签出文档https://github.com/jayway/JsonPath