有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

嵌套Json中的java数据表

希望得到您的帮助和帮助我正在尝试通过cucumber数据表发送嵌套的JSON,但它没有按预期发送,我也尝试了场景大纲,没有解决问题,请帮助我解决,谢谢提前

我有下面的场景

Scenario: provider edits new productWorkingDate
    Given productWorkingDates is edited with following fields
      | id       | productId | fromDate   | toDate     | name   | strictHours | maxUsedTicketsQuantity | errorCode |
      | bpvjPBpJ | WaNX2QOd  | 2022-07-01 | 2022-12-01 | Test55 | false       | 0                      | 0         |
    And TimeSlots is edited with following fields
      | dayOfWeek | startTime | endTime  | duration | quantity | usedQuantity | active |
      | Sunday    | 14:00:00  | 15:00:00 | 02:00:00 | 0        | 0            | true   |
      | Monday    | 14:00:00  | 15:00:00 | 02:00:00 | 0        | 0            | true   |
      
    Then verify status code is 200

我有下面的步骤定义

 @And("^TimeSlots is edited with following fields$")
    public void timeslotsIsCreatedWithFollowingFields(List<Map<String, String>> expectedTimeSlots) {
        TimeSlots timeSlots = new TimeSlots();



              for(int i = 0; i < expectedTimeSlots.size(); i ++) {
                  timeSlots.setDayOfWeek(expectedTimeSlots.get(i).get("dayOfWeek"));
                  timeSlots.setStartTime(expectedTimeSlots.get(i).get("startTime"));
                  timeSlots.setEndTime((expectedTimeSlots.get(i).get("endTime")));
                  timeSlots.setDuration(expectedTimeSlots.get(i).get("duration"));
                  timeSlots.setQuantity(Integer.parseInt(expectedTimeSlots.get(i).get("quantity")));
                  timeSlots.setUsedQuantity(Integer.parseInt(expectedTimeSlots.get(i).get("usedQuantity")));
                  timeSlots.setActive(Boolean.parseBoolean(expectedTimeSlots.get(i).get("active")));

              }

实际产出为:

{
    "productWorkingDate": {
        "id": "bpvjPBpJ",
        "productId": "WaNX2QOd",
        "fromDate": "2022-07-01",
        "toDate": "2022-12-01",
        "name": "Test55",
        "strictHours": false,
        "timeSlots": [
            {
                "id": "Wlqb8XOb",
                "productWorkingDateId": "bpvjPBpJ",
                "dayOfWeek": "Monday",
                "startTime": "14:00:00",
                "endTime": "15:00:00",
                "duration": "02:00:00",
                "quantity": 0,
                "usedQuantity": 0,
                "active": true,
                "deletedAt": null
            }
        ],
        "deletedAt": null,
        "maxUsedTicketsQuantity": 0,
        "errorCode": 0
    },
    "maxUsedTicketsQuantity": 0,
    "error": null,
    "errorCode": 0
}

预期产出为:

{
    "productWorkingDate": {
        "id": "bpvjPBpJ",
        "productId": "WaNX2QOd",
        "fromDate": "2022-07-01",
        "toDate": "2022-12-01",
        "name": "Test55",
        "strictHours": false,
        "timeSlots": [
            {
                "id": "4lrn8old",
                "productWorkingDateId": "bpvjPBpJ",
                "dayOfWeek": "Sunday",
                "startTime": "14:00:00",
                "endTime": "15:00:00",
                "duration": "02:00:00",
                "quantity": 0,
                "usedQuantity": 0,
                "active": true,
                "deletedAt": null
            },
            {
                "id": "dOnz85OV",
                "productWorkingDateId": "bpvjPBpJ",
                "dayOfWeek": "Monday",
                "startTime": "14:00:00",
                "endTime": "15:00:00",
                "duration": "02:00:00",
                "quantity": 0,
                "usedQuantity": 0,
                "active": true,
                "deletedAt": null
            }
        ],
        "deletedAt": null,
        "maxUsedTicketsQuantity": 0,
        "errorCode": 0
    },
    "maxUsedTicketsQuantity": 0,
    "error": null,
    "errorCode": 0
}

时隙的POJO类

我在我的POJO课程中使用龙目图书馆

import lombok.Data;

@Data

public class TimeSlots {
    private String id;
    private String productWorkingDateId;
    private String startTime;
    private String endTime;
    private String duration;
    private Integer quantity;
    private Integer usedQuantity;
    private boolean active;
    private String deletedAt;
    private String dayOfWeek;

共 (2) 个答案

  1. # 1 楼答案

    问题就在这里

    在json中timeSlots是一个数组,但在方法timeslotsIsCreatedWithFollowingFields中,您只创建了一个对象TimeSlots timeSlots = new TimeSlots();,然后通过setter编辑数据。逐步调试:

    TimeSlots timeSlots = new TimeSlots();
        
    i = 0; setA(0)  -> A = 0
        
    i = 1; setA(1)  -> A = 1
        
    end: timeSlots(A=1)
    

    更新: 我不知道,但一般来说,您需要创建一个列表来转换为Json数组

    你需要这样的东西

    @Given("TimeSlots is edited with following fields")
    public void timeslotsIsCreatedWithFollowingFields(List<Map<String, String>> expectedTimeSlots) {
        List<TimeSlots> listTimeSlots = new ArrayList<>();
    
        for (Map<String, String> expectedTimeSlot : expectedTimeSlots) {
            TimeSlots timeSlots = new TimeSlots();
            timeSlots.setDayOfWeek(expectedTimeSlot.get("dayOfWeek"));
            timeSlots.setStartTime(expectedTimeSlot.get("startTime"));
            timeSlots.setEndTime((expectedTimeSlot.get("endTime")));
            timeSlots.setDuration(expectedTimeSlot.get("duration"));
            timeSlots.setQuantity(Integer.parseInt(expectedTimeSlot.get("quantity")));
            timeSlots.setUsedQuantity(Integer.parseInt(expectedTimeSlot.get("usedQuantity")));
            timeSlots.setActive(Boolean.parseBoolean(expectedTimeSlot.get("active")));
            
            listTimeSlots.add(timeSlots);
        }
    }
    
  2. # 2 楼答案

    您似乎已经编辑了我复制错误所需的大部分/部分信息,我只是根据您提供的内容构建了一个样本,并成功地获得了所需的输出

    您正在为for循环之外的时隙创建一个对象,但它应该在循环内

    功能文件:

    Feature: STACK
    
    Scenario: provider edits new productWorkingDate
    Given productWorkingDates is edited with following fields
    | id       | productId | fromDate   | toDate     | name   | strictHours | maxUsedTicketsQuantity | errorCode |
    | bpvjPBpJ | WaNX2QOd  | 2022-07-01 | 2022-12-01 | Test55 | false       |                      0 |         0 |
    And TimeSlots is edited with following fields
    | dayOfWeek | startTime | endTime  | duration | quantity | usedQuantity | active | productWorkingDateId | id       |
    | Sunday    | 14:00:00  | 15:00:00 | 02:00:00 |        0 |            0 | true   | bpvjPBpJ             | 4lrn8old |
    | Monday    | 14:00:00  | 15:00:00 | 02:00:00 |        0 |            0 | true   | bpvjPBpJ             | dOnz85OV |
    

    步骤定义:

    ProductWorkingDate pw = new ProductWorkingDate();
    Example ex = new Example();
    
    @Given("productWorkingDates is edited with following fields")
    public void product_working_dates_is_edited_with_following_fields(io.cucumber.datatable.DataTable dataTable) {
    
        pw.setId("bpvjPBpJ");
        pw.setProductId("WaNX2QOd");
        pw.setFromDate("2022-07-01");
        pw.setToDate("2022-12-01");
        pw.setName("Test55");
        pw.setStrictHours(false);
    
    }
    
    @Given("TimeSlots is edited with following fields")
    public void time_slots_is_edited_with_following_fields(List<Map<String, String>> expectedTimeSlots)
            throws JsonProcessingException {
    
        pw.setMaxUsedTicketsQuantity(0);
        pw.setDeletedAt("Test");
        pw.setErrorCode(0);
    
        List<TimeSlots> listTimeSlots = new ArrayList<TimeSlots>();
    
        for (int i = 0; i < expectedTimeSlots.size(); i++) {
    
            TimeSlots timeSlots = new TimeSlots();
    
            timeSlots.setId(expectedTimeSlots.get(i).get("id"));
            timeSlots.setProductWorkingDateId(expectedTimeSlots.get(i).get("productWorkingDateId"));
            timeSlots.setDayOfWeek(expectedTimeSlots.get(i).get("dayOfWeek"));
            timeSlots.setStartTime(expectedTimeSlots.get(i).get("startTime"));
            timeSlots.setEndTime((expectedTimeSlots.get(i).get("endTime")));
            timeSlots.setDuration(expectedTimeSlots.get(i).get("duration"));
            timeSlots.setQuantity(Integer.parseInt(expectedTimeSlots.get(i).get("quantity")));
            timeSlots.setUsedQuantity(Integer.parseInt(expectedTimeSlots.get(i).get("usedQuantity")));
            timeSlots.setActive(Boolean.parseBoolean(expectedTimeSlots.get(i).get("active")));
    
            listTimeSlots.add(timeSlots);
    
        }
    
        pw.setTimeSlots(listTimeSlots);
        ex.setProductWorkingDate(pw);
        ex.setMaxUsedTicketsQuantity(0);
        ex.setError("test");
        ex.setErrorCode(0);
    
        RestAssured.given().body(ex).when().post("http://localhost:8080/stack")...
    }