测试jsonpath该数组包含任何顺序的特定对象

时间:2014-10-21 07:22:51

标签: spring spring-mvc spring-test jsonpath

我正在测试一个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来测试它?

3 个答案:

答案 0 :(得分:13)

这似乎是更好的方法:

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

答案 1 :(得分:1)

只是扩展Marcel提供的答案,因为它帮助我解决了同样的问题,但我不得不稍微修改一下。我发现了'&amp;&amp;'我们目前在一个项目(0.8.1)中使用的jsonpath版本不支持operator,根据这个问题它在12月8日被标记为'done',这意味着它应该在最新版本2.0中提供:< / p>

JSON Path issue 27 - AND operators

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

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

答案 2 :(得分:0)

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

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