当前位置: 首页 > 知识库问答 >
问题:

检查从jsonPath到JUnit hamcrest匹配器的数组项转换

缪风史
2023-03-14

几乎没有尝试检查json是否有包含两项的数组:

{
  "sections" : [
    {
      "name" : "A",
      "description" : "aaa"
    },
    {
      "name" : "B",
      "description" : "bbb"
    }
  ]
}

但是只带了

.andExpect(jsonPath("$.sections[?(@.name=='A' && @.description=='aaa')]", hasSize(1)))

有没有办法用hasItem/has property/containinaryorder把这个转换成Harmcrest匹配器?

共有1个答案

云宏儒
2023-03-14

我认为将Json数组反序列化为对象列表将很容易使用Hamcrest匹配器。您必须重写<code>equals()对象是否在创建的<code>段

Section.java

public class Section {
    private String name;
    private String description;

    public Section(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }

        if (obj.getClass() != this.getClass()) {
            return false;
        }

        final Section other = (Section) obj;
        if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
            return false;
        }

        if (!this.description.equals(other.description)) {
            return false;
        }

        return true;
    }
}

然后使用您喜欢的任何Hamcrest Matcher。

RestAssured.baseURI="https://run.mocky.io/v3/bc929050-35ba-42a1-86b1-58f3fd1ead83";

List<Section> sections =  RestAssured.given()
        .when()
        .get()
        .then()
        .extract().jsonPath().getList("sections", Section.class);

Section sectionA = new Section("A", "aaa");
Section sectionB = new Section("B", "bbb");

List<Section> sectionList = new ArrayList<>();
sectionList.add(sectionA);
sectionList.add(sectionB);

assertThat(sections, hasItem(sectionA)); // pass
assertThat(sections, hasSize(2)); // pass
assertThat(sections, hasItem(hasProperty("name", equalTo("B")))); // pass
assertThat(sections, equalTo(sectionList)); // pass
assertThat(sections, containsInAnyOrder(sectionList.toArray())); // pass
 类似资料:
  • 我正在为我的 REST API 控制器编写测试,我需要检查返回的 对象中的 值,请参阅此测试方法: 但是测试产生了这个错误: 似乎ID被正确返回,但被序列化为不同的结构。 我的代码有什么问题?

  • 问题内容: 我正在使用/ 来获取HTTP响应中的响应代码。返回1,但是尝试获取异常!知道为什么吗? 这是代码: 这是输出: 问题答案: 总是会创建一个新的匹配器,因此您需要再次致电。 尝试:

  • 我有一个API,它返回一个将在UI中显示的JSON对象。对象中字段的顺序很重要,因为UI希望按该顺序显示字段。我想编写一个单元测试来确保对象中字段的顺序是正确的。我的API响应如下所示: 使用spring boot的< code>MockMvc库,我想编写一个这样的表达式来验证字段是否按顺序返回: 显然,上述方法不起作用,但我不确定我应该使用哪种类型的来尝试并验证字段是否正确。

  • 问题内容: 我有一个这样的对象数组: 我知道我可以找到匹配的项目,如下所示: 但是现在如何将其从原始文件中删除?我希望可以以某种方式返回索引,以便可以使用。或者更好的是,我想做这样的事情: 有任何想法吗? 问题答案: 您不了解的是Array是一个结构,因此 是一个值类型 。它不能像类实例那样在适当位置进行突变。因此,即使您扩展Array来编写一个变异方法,您也将始终在幕后创建一个新的数组。 因此,

  • 问题内容: 我有多个带有字符串值的数组,我想比较它们,只保留 所有 它们之间相同的匹配结果。 给出以下示例代码: 我想产生以下数组,其中包含来自所有给定数组的匹配项: 我知道我可以将所有数组组合在一起,但这只是给我一个包含所有内容以及重复项的数组。是否可以轻松完成此操作而无需诸如underscore.js之类的库的开销? 编辑 我想我应该提到的是,可能存在未知数量的数组,我只是以3为例。 问题答案

  • 我有多个带有字符串值的数组,我想对它们进行比较,并且只保留它们之间相同的匹配结果。 给定此示例代码: 我想生成以下数组,它包含所有给定数组的匹配项: 编辑我想我应该提到可能有未知数量的数组,我只是使用3作为一个例子。