我通过检查每个项目名称或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)))));

10-08 04:18