首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在正文中的每个数组项中验证值或其他值?

如何在正文中的每个数组项中验证值或其他值?
EN

Stack Overflow用户
提问于 2019-10-10 08:57:47
回答 2查看 1.1K关注 0票数 2

我正在通过检查每个项目名称或panCode中是否包含"PAN“来验证响应主体。

如果每个项目的名称或panCode都包含"PAN“,并且我有错误,这并不适用于验证。

预期:每个项目都是(hasProperty("name",包含“PAN”的字符串)或hasProperty("panCode",包含“PAN”的字符串))

实际:{"id":1000000002099,“名称”:“”,"panCode":"PANPL00002101","idAttachedDu":1000000008574},{"id":1000000002100,“名称”:“”,"panCode":"PANPL00002102","idAttachedDu":1000000008574}

代码语言:javascript
复制
response.then().assertThat().body(everyItem(
                either(hasProperty("name", containsString(criteria)))
               .or(hasProperty("panCode", containsString(criteria)))));

如何使用hamcrest在体内验证姓名或panCode?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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一起工作的匹配器。

下面是您的示例的工作方式:

代码语言:javascript
复制
response.then().assertThat()
    .body("$", everyItem(either(hasEntry(equalTo("name"), containsString(criteria)))
        .or(hasEntry(equalTo("panCode"), containsString(criteria)))));
票数 0
EN

Stack Overflow用户

发布于 2019-10-13 13:30:58

由于响应体是直接向前的json数组,下面的方法可以工作。

首先,最好让类表示数组的一个项,比如Pan

代码语言:javascript
复制
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 )

代码语言:javascript
复制
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0</version>
</dependency>

最后,获取响应,将其转换为Pan数组,然后进行断言。(请根据需要更改url,额外提示:使用紫红色进行本地模拟服务器)

代码语言:javascript
复制
@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"))))
    );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58319076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档