我正在通过检查每个项目名称或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?
发布于 2019-10-14 15:10:45
您的示例不起作用的原因是hasProperty(java.lang.String propertyName, Matcher<?> valueMatcher) matcher正在处理JavaBean对象,而JsonPath则将所有内容表示为映射。看看这个方法的描述,来自Hamcrest的Matchers:
创建一个匹配器,当被检查的对象具有一个具有指定名称的JavaBean属性时,该属性的值满足指定的匹配器。
当您使用body(Matcher<?> matcher, Matcher<?>... additionalMatchers)处理响应时,它会将响应JSON转换为映射,并且不能在这里应用JavaBean匹配器。相反,尝试使用与java.util.Map一起工作的匹配器。
下面是您的示例的工作方式:
response.then().assertThat()
.body("$", everyItem(either(hasEntry(equalTo("name"), containsString(criteria)))
.or(hasEntry(equalTo("panCode"), containsString(criteria)))));发布于 2019-10-13 13:30:58
由于响应体是直接向前的json数组,下面的方法可以工作。
首先,最好让类表示数组的一个项,比如Pan。
public static class Pan
{
private long id;
private String name;
private String panCode;
private String idAttachedDu;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPanCode() {
return panCode;
}
public void setPanCode(String panCode) {
this.panCode = panCode;
}
public String getIdAttachedDu() {
return idAttachedDu;
}
public void setIdAttachedDu(String idAttachedDu) {
this.idAttachedDu = idAttachedDu;
}
}添加jackson或gson将json反序列化到这种类型的对象中(此处使用jackson )
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>最后,获取响应,将其转换为Pan数组,然后进行断言。(请根据需要更改url,额外提示:使用紫红色进行本地模拟服务器)
@Test
void panRestAssuredTest() {
Response response = given().headers("Content-Type", ContentType.JSON, "Accept", ContentType.JSON).
when().get("http://localhost:8000/restassured").
then().contentType(ContentType.JSON).extract().response();
List<Pan> pans = response.jsonPath().getList("$", Pan.class);
assertThat(pans, everyItem(
either(hasProperty("panCode", containsString("PAN")))
.or(hasProperty("name", containsString("PAN"))))
);
}https://stackoverflow.com/questions/58319076
复制相似问题