我正在使用 JsonPath 来测试 API 的 REST 端点。我的测试用例看起来像这样。
首先我创建新对象
class Item {
String name;
int id;
List<String> places;
}
String name = "Randomname" + new Random().nextLong();
JSONObject obj = new Item(name, 3, Arrays.asList("Rome3", "London3", "Paris3"));
post("/items").content(obj);
Run Code Online (Sandbox Code Playgroud)
然后我得到所有项目的列表,并检查我刚刚创建的项目是否在列表中。
mockMvc.perform(get("/api/v1/test"))
.andExpect(jsonPath("$.data[*].name", hasItems("item 1", "item 2"))) // Fine
.andExpect(jsonPath("$.data[?(@.id == 1)].name", contains("item 1")))
.andExpect(jsonPath("$.data[?(@.id == 1)].places", contains(contains("Rome1", "London1", "Paris1"))))
.andReturn();
Run Code Online (Sandbox Code Playgroud)
这可行,但我认为我做得不对,因为我有一个嵌套的contains(contains()). (我已将完整的 JSON 响应放在本文末尾。)
问题是因为 JsonPath 表达式返回一个列表,所以我需要使用列表匹配器。例如,不要写这个
jsonPath("$.data[?(@.id == 1)].name", is("item 1"))
Run Code Online (Sandbox Code Playgroud)
我需要这样写
jsonPath("$.data[?(@.id == 1)].name", contains("item 1"))
Run Code Online (Sandbox Code Playgroud)
因为 JsonPath 表达式将返回一个包含一个元素的 JSON …