返回

Rest-Assured 与 Hamcrest 比较 int 数组,巧用 arrayContainingInAnyOrder 提升灵活性

java

使用 Rest-Assured 和 Hamcrest 匹配器比较 int 数组

问题陈述

在使用 Rest-Assured 和 Hamcrest 匹配器时,我们可能会遇到比较数组的困难,特别是当数组包含 int 时。这种比较需要仔细考虑元素的顺序和类型匹配。

解决方案

解决此问题的一种方法是使用 arrayContainingInAnyOrder 匹配器。此匹配器允许比较数组中的元素,而无需考虑它们的顺序。

使用 arrayContainingInAnyOrder 的优势

  • 顺序无关性: 它允许比较数组中的元素,而无需考虑它们的顺序。
  • 灵活比较: 它消除了使用 containsInRelativeOrder 时可能发生的顺序问题。

更新后的断言代码:

.body("error.errorObjects[0].risks.description", containsInRelativeOrder(description),
                        "error.errorObjects[0].risks.riskId", arrayContainingInAnyOrder(riskId));

其他提示

  • 类型匹配: 确保数组中的元素类型与断言中指定的匹配器类型一致。
  • 明确的断言消息: 使用明确的断言消息,以便在出现错误时轻松进行调试。
  • JSON 验证: 仔细检查 JSON 响应和断言以确保它们正确。

示例代码

import com.jayway.restassured.RestAssured;
import org.hamcrest.CoreMatchers;

public class RestAssuredWithInts {

    public static void main(String[] args) {
        int[] riskId = {6654152, 6654155};
        String[] description =  {"Risk1",  "Risk2"};

        RestAssured.given()
                .when()
                .get("https://api.example.com/risks")
                .then()
                .body("error.errorObjects[0].risks.description", CoreMatchers.containsInRelativeOrder(description),
                        "error.errorObjects[0].risks.riskId", CoreMatchers.arrayContainingInAnyOrder(riskId));
    }
}

常见问题解答

  • 为什么 containsInRelativeOrder 不适用于 int 数组?
    containsInRelativeOrder 要求数组中的元素按照指定的顺序出现,这对于 int 数组来说不适用。

  • arrayContainingInAnyOrder 如何处理重复元素?
    arrayContainingInAnyOrder 会比较数组中所有元素,即使有重复元素。

  • 如何断言 int 数组中的特定元素?
    可以使用 hasItemInArray 匹配器,它允许您断言数组中包含特定元素。

  • 如何处理嵌套的 int 数组?
    使用嵌套的匹配器,例如 hasItemInArray(hasItemInArray(element)),可以断言嵌套的 int 数组。

  • 如何扩展此解决方案以支持其他类型的数据?
    此解决方案可以扩展到支持其他类型的数据,例如字符串、浮点数和自定义对象,只需使用适当的 Hamcrest 匹配器即可。

结论

通过使用 arrayContainingInAnyOrder 匹配器,我们可以轻松比较 int 数组,而无需考虑它们的顺序。这提高了 Rest-Assured 测试的灵活性和可靠性。