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

在放心的java中验证多个响应体节点(键值)

万俟经纶
2023-03-14

给定:

  package com.company;

import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.hamcrest.core.Is;


public class Main {

    public static void main(String[] args) {
        RestAssured.baseURI = "///URL";
        RequestSpecification request = RestAssured.given();

        String body_content = "{\n" +
                "\t\"name\":\"Santosh\",\n" +
                "\t\"email\":\"santosh@SUMEMAIL.com\",\n" +
                "\t\"age\":30,\n" +
                "\t\"address\":{\n" +
                "\t\t\"city\":\"Bangalore\",\n" +
                "\t\t\"state\":\"karnataka\",\n" +
                "\t\t\"pinCode\":\"123\"\n" +
                "\t}\n" +
                "}";

//        JSONObject jsonObject = new JSONObject(body_content);

        request.header("Content-Type", "application/json");
        request.body(body_content);

        Response response = request.post("/persons");
        System.out.println("The response is \n -------------------- \n" + response.getBody().asPrettyString());

        String myPersonId = response.path("name").toString();
        System.out.println("Its my personId = " + myPersonId);
        response.then().assertThat().body("name", Is.is("Santo1sh"));
        response.then().assertThat().body("email", Is.is("not the wright email")); // Basically I want to test multiple assertions in the same execution


    }
}

响应体json是:

{
    "personId": "c27a3364-cd93-4c10-bb58-4a17c520b54d",
    "name": "Santosh",
    "age": 30,
    "email": "santosh@gmail.com",
    "address": {
        "city": "Bangalore",
        "state": "karnataka",
        "pinCode": 560037
    }
}

使用上面的代码,当执行最后一个断言时,它将故意失败,并且以下任何操作都不会被执行。我试图做的是从响应的主体中测试多个值,但不要在一开始就停止失败,如何放心地完成此操作?

正在引发的异常:

   Exception in thread "main" java.lang.AssertionError: 1 expectation failed.
JSON path name doesn't match.
Expected: is "Santo1sh"
  Actual: Santosh

共有1个答案

周浩博
2023-03-14

有两种方法可以解决您的问题。

解决方案1:利用断言库内置的软断言函数,如TestNG和AssertJ。

例如:使用AssertJ

@Test
public void test_1(){
   ...
   SoftAssertions softly = new SoftAssertions();
   softly.assertThat(response.path("name")).isEqualTo("Santo1sh");
   softly.assertThat(response.path("email")).isEqualTo("not the wright email");
   softly.assertAll();
}

解决方案2:反序列化对POJO的响应,然后比较对象。要定义对象如何相等,POJO需要重写<code>equals方法

Person expect = new Person(); 

//set value for Person fields: personId, name, email ...

Person actual = JsonPath.with(res).getObject("", Person.class);

assertThat(actual, is(expect));
import lombok.Data;
import lombok.EqualsAndHashCode;


@Data
@EqualsAndHashCode
class Person{
    private String personId;
    private String name;
    private int age;
    private String email;
    private Address address;
}

@Data
@EqualsAndHashCode
class Address{
    private String city;
    private String state;
    private long pinCode;
}
 类似资料:
  • 在我的测试中,a有这样的回答: 其中和是键-值对。 关于和key-value对也是如此。 响应可以包括许多键-值对。 我需要能够验证是否在响应中提供了一些键和值。 我使用,所以我知道我可以使用这样的路径来获取键和使用我编写的这些方法来获取值: 其中传递的< code>param是响应中的参数路径,如< code>commands.value.path。< br >但是我认为这将为我带来响应正文中匹

  • 放心,当我们这样做时 抛出的错误总是连续的,也就是说,如果状态代码失败,它不会检查contentType是否是JSON。 此外,抛出的错误始终是,断言错误(预期:200,实际:404)。无法从中了解实际响应是什么,如果启用日志记录,它将打印在标准输出上,但其他任何方式都不可用。 是否有任何方法来构建或设置类似于我们如何实现<code>过滤器 我有一个 rest api 框架,其中大多数验证都是使用

  • 我有一个示例JSON响应 如何验证何时然后当然后 尝试过类似的东西,但它不起作用。 我错过了什么还是做错了什么?

  • 我有一个与 Rest Assured 中的响应正文验证相关的问题。让我们假设,我有一个像json这样的响应体。 我需要检查: 如果图书部分包含儿童类型 如果一本儿童类书籍的自动名称为Eric 第一个断言可以是这样的: 但是我需要检查它的作者的名字是否是威廉。有没有办法使用jsonPath检查它? 我假设,我可以做反序列化(例如,x. List

  • 我是大一新生,请放心。我有一个获取响应体的简单测试,我想验证响应体是否与我的POJO类匹配。 这是我的测试: 这是我的POJO类: 那么如何验证响应体结构等于我的POJO类呢? 提前感谢

  • 我使用的是junit4提供的restassured。在我的测试方法中,我在mongodb中创建了一个对象,当我运行测试时,它也成功地持久化了。但是我需要存储创建的id,所以我尝试获取响应体。但是< code>response.getBody()。asString()为空。 当我从外部调用restendpoint时,它会返回带有相关字段的响应体,因此rest API没有问题。 如果上述问题没有答案,