我通过检查每个项目名称或panCode中是否包含“ PAN”来验证响应正文。
如果每个商品名称或panCode都包含“ PAN”并且我有错误,那将无法验证
预期:每个项目都是(hasProperty(“ name”,包含“ PAN”的字符串)或hasProperty(“ panCode”,包含“ PAN”的字符串))
实际:[{“ id”:1000000002099,“名称”:“”,“ panCode”:“ PANPL00002101”,“ idAttachedDu”:1000000008574},{“ id”:1000000002100,“名称”:“”,“ panCode”: “ PANPL00002102”,“ idAttachedDu”:1000000008574}]
response.then().assertThat().body(everyItem(
either(hasProperty("name", containsString(criteria)))
.or(hasProperty("panCode", containsString(criteria)))));
我如何使用hamcrest验证名称或panCode在体内?
最佳答案
您的示例无法正常运行的原因是hasProperty(java.lang.String propertyName, Matcher<?> valueMatcher)
匹配器正在使用JavaBean对象,而JsonPath将所有内容都表示为Map。看一下Hamcrest的Matchers JavaDoc中该方法的描述:
创建一个匹配器,该匹配器在被检查对象具有JavaBean时进行匹配
具有指定名称的属性,其值满足指定的属性
匹配器。
当您使用body(Matcher<?> matcher, Matcher<?>... additionalMatchers)
处理响应时,它将响应JSON转换为map,并且JavaBean匹配器无法在此处应用。而是尝试使用与java.util.Map
一起使用的匹配器。
这是您的示例的工作方式:
response.then().assertThat()
.body("$", everyItem(either(hasEntry(equalTo("name"), containsString(criteria)))
.or(hasEntry(equalTo("panCode"), containsString(criteria)))));