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