RestAssured assertThat,键的通配符

Posted

技术标签:

【中文标题】RestAssured assertThat,键的通配符【英文标题】:RestAssured assertThat, wildcard for key 【发布时间】:2022-01-01 06:07:11 【问题描述】:

我有一个这样的对象,


  "john": 
    "number": "123"
  ,
  "sarah": 
    "number":  "123"
  

这是一个对象,其中人名是对象的键,例如地图。

在 restAssured 中,我如何测试 ValidatableResponse 是否属于 john 或 sarah 的任何数字都与某个值匹配。在这种情况下,我知道只有一个人,但这里似乎有一个“任何”匹配器。

我尝试过assertThat().body("*.number"), Matchers.is("myValue)" 但它不起作用并出现错误

【问题讨论】:

【参考方案1】:

您的问题是使用动态键(在本例中为人名)从 json 中提取值。 Rest-Assured 中没有内置功能可以帮助您。

解决它

    您可以使用JsonPath jayway 通过深度扫描功能提取number 的列表 然后使用 Hamcrest 的 hasItem 断言。
import com.jayway.jsonpath.JsonPath;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItem;

@Test
void name() 
    String json = "\n" +
            "  \"john\": \n" +
            "    \"number\": \"123\"\n" +
            "  ,\n" +
            "  \"sarah\": \n" +
            "    \"number\":  \"123\"\n" +
            "  \n" +
            "";

    List<String> numbers = JsonPath.read(json, "$..number");
    assertThat(numbers, hasItem("123"));


注意:

请不要在这里混淆 2 个 JsonPath 类。一个是 Rest-Assured,一个是 JsonPath jayway。

不得不说我很讨厌这样的json结构,还是用数组来分组比较好。

[
  
    "name": "john",
    "number": "123"
  ,
  
    "name": "sarah",
    "number": "123"
  
]

【讨论】:

以上是关于RestAssured assertThat,键的通配符的主要内容,如果未能解决你的问题,请参考以下文章

Usage and Idioms——Matchers and assertthat

当 JUnit 5 没有 assertThat() 函数时,如何将 Hamcrest 与 JUnit 5 一起使用?

Junit4中的新断言assertThat的是用方法

导入 io.restassured.RestAssured 无法解析

PHPUnit:assertThat()是否增加断言计数?

线程“ main”中的异常java.lang.NoClassDefFoundError:io / restassured / RestAssured