Java 使用JsonPath和Hamcrest匹配器匹配字符串列表的更好方法
我正在使用JsonPath测试API的REST端点。我的测试用例看起来像这样 首先,我创建新对象Java 使用JsonPath和Hamcrest匹配器匹配字符串列表的更好方法,java,hamcrest,jsonpath,Java,Hamcrest,Jsonpath,我正在使用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", "Lond
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);
这是可行的,但我认为我做得不对,因为我有一个嵌套的contains(contains())
。(我已经在本文末尾给出了完整的JSON响应。)
问题是,因为JsonPath表达式返回一个列表,所以我需要使用列表匹配器。例如,与其写这个
jsonPath("$.data[?(@.id == 1)].name", is("item 1"))
我需要这样写
jsonPath("$.data[?(@.id == 1)].name", contains("item 1"))
因为JsonPath表达式将返回一个元素的JSON列表
[
"item 1"
]
这并不是很糟糕,但列表更糟糕,例如,试图检查变量位置中的字符串列表是否包含我想要的内容。返回的JSON是一个列表列表,因此这个JsonPath表达式
jsonPath("$.data[?(@.id == 1)].places"
我会退还这个
[
[
"Rome2",
"London3",
"Paris3"
]
]
所以它需要一个嵌套的hasItems
jsonPath("$.data[?(@.id == 1)].places", hasItems(hasItems("Rome1", "London1")))
这样做是可行的,但这样做只会让我觉得我做得不对,我错过了一些东西
所以我的问题是,什么是处理检查/匹配列表的适当方法
是否有更好的方法验证端点返回的JSON?我觉得原始编辑更清晰。还原了更改。如果可以将jsonpath表达式重新格式化为确定表达式而不是不确定表达式,那么应该更简单。然而,如果你不能做到这一点,那么我不确定是否有更好的选择。
jsonPath("$.data[?(@.id == 1)].places", hasItems(hasItems("Rome1", "London1")))