spring 使用mockmvc测试如何处理无序数组

mnemlml8  于 2022-10-30  发布在  Spring
关注(0)|答案(2)|浏览(221)

当返回的数组无序时,如何测试以获得正确的测试结果?我的测试失败,因为在每次测试运行中数组中的顺序不同。如何解决此问题或说明无序数组?

mockMvc.perform(delete("/deleteSomeObject" + "/objIdLong" + "/objFKeyString"))
    .
    .
    .andExpect(jsonPath("$[0].id.objIdLong", is(533252)))
    .andExpect(jsonPath("$[0].id.objFKeyString", is("SomeString")))
    .andExpect(jsonPath("$[1].id.objIdLong", is(642654252)))
    .andExpect(jsonPath("$[1].id.objFKeyString", is("ThisString")))
    .andExpect(jsonPath("$[2].id.objIdLong", is(4624352)))
    .andExpect(jsonPath("$[2].id.objFKeyString", is("SomeOtherString")));
dwthyt8l

dwthyt8l1#

您可以使用'any element'指令,并且为了防止误报,其中一个元素具有预期的objIdLong,而另一个元素具有预期的objFKeyString,您可以合并存取子。
大概是这样的:

.andExpect(jsonPath('$.id[?(@.objIdLong == 533252 && @.objFKeyString == \'SomeString\')]').exists())
.andExpect(jsonPath('$.id[?(@.objIdLong == 642654252 && @.objFKeyString == \'ThisString\')]').exists())
.andExpect(jsonPath('$.id[?(@.objIdLong == 4624352 && @.objFKeyString == \'SomeOtherString\')]').exists())

只要返回的JSON包含以下内容,这些Assert将被视为真:

  • 包含objIdLong=533252objFKeyString="SomeString"id子文档
  • 包含objIdLong=642654252objFKeyString="ThisString"id子文档
  • 包含objIdLong=4624352objFKeyString="SomeOtherString"id子文档
uklbhaso

uklbhaso2#

在撰写本文时,有一种更简单的方法.andExpect(content().json(expected_response))
.json文件夹(expected_response)validation有一个选项来进行严格或宽松的检查。这对于你不关心响应顺序的数组很有帮助。如果你想打开严格的检查,你可以像.json(expected_response,true)一样打开它。你也可以从文件读取器加载整个响应,然后直接Assert,而不必繁琐地写json路径。下面是一个完整的示例。

@Test
  @DisplayName("invalid fields")
  void invalidfields() throws Exception {

    String request = getResourceFileAsString("test-data/http-request/invalid-fields.json");
    String response_file_path = "test-data/http-response/error-messages/invalid-fields.json";
    String expected_response = getResourceFileAsString(response_file_path);

    mockMvc.perform(evaluateRulesOnData(TRACKING_ID.toString(), request))
        .andExpect(status().isBadRequest())
        .andExpect(content().json(expected_response));
  }

用于从类路径加载测试文件的helper函数

public static String getResourceFileAsString(String fileName) throws IOException {
    Resource resource = new ClassPathResource(fileName);
    File file = resource.getFile();
    return new String(Files.readAllBytes(file.toPath()));
  }

预期响应有一个数组,该数组包含列表中的许多元素,这些元素在每个测试运行期间都是匹配的,尽管它们的顺序是随机的。

相关问题