RestAssured assertThat,键的通配符
Posted
技术标签:
【中文标题】RestAssured assertThat,键的通配符【英文标题】:RestAssured assertThat, wildcard for key 【发布时间】:2022-01-01 06:07:11 【问题描述】:我有一个这样的对象,
"john":
"number": "123"
,
"sarah":
"number": "123"
这是一个对象,其中人名是对象的键,例如地图。
在 restAssured 中,我如何测试 ValidatableResponse 是否属于 john 或 sarah 的任何数字都与某个值匹配。在这种情况下,我知道只有一个人,但这里似乎有一个“任何”匹配器。
我尝试过assertThat().body("*.number"), Matchers.is("myValue)
" 但它不起作用并出现错误
【问题讨论】:
【参考方案1】:您的问题是使用动态键(在本例中为人名)从 json 中提取值。 Rest-Assured 中没有内置功能可以帮助您。
解决它
-
您可以使用JsonPath jayway 通过深度扫描功能提取
number
的列表
然后使用 Hamcrest 的 hasItem
断言。
import com.jayway.jsonpath.JsonPath;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItem;
@Test
void name()
String json = "\n" +
" \"john\": \n" +
" \"number\": \"123\"\n" +
" ,\n" +
" \"sarah\": \n" +
" \"number\": \"123\"\n" +
" \n" +
"";
List<String> numbers = JsonPath.read(json, "$..number");
assertThat(numbers, hasItem("123"));
注意:
请不要在这里混淆 2 个 JsonPath 类。一个是 Rest-Assured,一个是 JsonPath jayway。
不得不说我很讨厌这样的json结构,还是用数组来分组比较好。
[
"name": "john",
"number": "123"
,
"name": "sarah",
"number": "123"
]
【讨论】:
以上是关于RestAssured assertThat,键的通配符的主要内容,如果未能解决你的问题,请参考以下文章
Usage and Idioms——Matchers and assertthat
当 JUnit 5 没有 assertThat() 函数时,如何将 Hamcrest 与 JUnit 5 一起使用?
导入 io.restassured.RestAssured 无法解析
线程“ main”中的异常java.lang.NoClassDefFoundError:io / restassured / RestAssured