【问题标题】:Testing jsonpath that array contains specfic objects in any order测试数组包含任何顺序的特定对象的jsonpath
【发布时间】:2014-12-16 08:16:49
【问题描述】:

我正在测试一个 Spring 控制器,它可以返回 400 字段错误。这些字段错误是包含“路径”和“消息”字段的对象数组。

现在我想测试一些特定的调用是否返回具有特定路径和消息的多个错误。

我无法找到比下面更接近的东西:

.andExpect(jsonPath("$.fieldErrors[*].path", containsInAnyOrder("title", "description")))
.andExpect(jsonPath("$.fieldErrors[*].message", containsInAnyOrder(
    "The maximum length of the description is 500 characters.",
    "The maximum length of the title is 100 characters.")));

但这会让选项保持打开状态,即接受“路径”和“消息”的错误组合。

任何想法如何改进 jsonpath 来测试这个?

【问题讨论】:

    标签: spring spring-mvc spring-test jsonpath


    【解决方案1】:

    您可以使用org.hamcrest.Matchers.containsInAnyOrder()

    .andExpect(jsonPath("$.fieldErrors[*].path", Matchers.contains("str1", "str2")))
    

    【讨论】:

      【解决方案2】:

      只是扩展了 Marcel 提供的答案,因为它帮助我解决了同样的问题,但我不得不稍作修改。我发现我们目前在一个项目中使用的 jsonpath 版本(0.8.1)不支持“&&”运算符,根据这个问题,它在 12 月 8 日被标记为“完成”,这意味着它应该在最新版本,2.0:

      JSON Path issue 27 - AND operators

      我最终使用的逻辑 AND 的“旧”语法也显示在该问题上,使用上面的示例将是:

      .andExpect(jsonPath('$.fieldErrors[?(@.path == \'title\')][?(@.message == \'The maximum length of the title is 100 characters.\')]').exists())
      

      【讨论】:

        【解决方案3】:

        这似乎是更好的方法:

        .andExpect(jsonPath('$.fieldErrors[?(@.path == \'title\' && @.message == \'The maximum length of the title is 100 characters.\')]').exists())
        

        【讨论】:

          猜你喜欢
          • 2022-01-24
          • 1970-01-01
          • 2018-08-09
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多