当前位置: 首页 > 知识库问答 >
问题:

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

陈弘厚
2023-03-14

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

@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)

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

我的代码有什么问题?

共有2个答案

黄啸
2023-03-14

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

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

您不应该使用<code>$..id</code>,这会返回一个数组。在此处签出文档https://github.com/jayway/JsonPath

石博艺
2023-03-14

在我看来,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))); 
 类似资料:
  • 我是不是漏掉了什么?提前感谢!

  • 问题内容: 如何通过所有多词搜索仅获取经过过滤的匹配结果。我有这个示例表,其中titleid是一个映射int字段,personid是一个关键字: 删除结果为: 使用这样的示例查询: 我得到以下结果: 也许这会有所帮助,我在sql中进行了查询并获得了预期的结果。我所做的是让查询给我与搜索到的参数数量匹配的titleid之和。这只是为了更多地自我解释,其思想是使用elasticsearch。 问题答案

  • 我有一个接口,它提供了一个方法,返回一个,其中包含一个

  • 问题内容: 做一个简单的测试时,我就在用Java编写正则表达式 但是在JavaScript中 这里发生了什么?我可以使我的Java regex模式“ q”的行为与JavaScript相同吗? 问题答案: 在JavaScript中,返回与使用的正则表达式匹配的子字符串。在Java中,检查整个字符串是否与正则表达式匹配。 如果要查找与正则表达式匹配的子字符串,请使用Pattern和Matcher类,例

  • 我可以使用哪种匹配器? { test: /\.js$/, loader: 'babel-loader' } - Matches just .js { test: /\.(js|jsx)$/, loader: 'babel-loader' } - Matches both js and jsx Generally put it's just a JavaScript regex so standar

  • 当我通过一个特定方面进行过滤时,该特定字段的方面在结果中被正确过滤,但其他方面的字段保持不变。解释这一点的最佳方法是使用查询和响应。 因此,如您所见,它返回所有方面,即使唯一的结果位于Eugene。它还返回的计数7。为什么它会返回所有这些额外的方面和错误的计数?下面是我的ruby映射。