数据 table in cucumber 发送嵌套 Json
Data table in cucumber sending nested Json
希望得到您的帮助和帮助我正在尝试通过黄瓜数据 table 发送嵌套的 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 class 用于时隙
我在我的 POJO 中使用 classes lombok 库;
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;
问题出在这里
timeSlots
在json中是一个数组,但是在方法timeslotsIsCreatedWithFollowingFields
中你只创建了1个对象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);
}
}
你似乎已经编辑了我复制错误所需的大部分/部分信息,我只是根据你提供的内容构建了一个示例并设法获得了所需的输出
您正在 for 循环外为 TimeSlots 创建一个对象,但它应该在循环内
专题文件:
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")...
}
希望得到您的帮助和帮助我正在尝试通过黄瓜数据 table 发送嵌套的 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 class 用于时隙
我在我的 POJO 中使用 classes lombok 库;
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;
问题出在这里
timeSlots
在json中是一个数组,但是在方法timeslotsIsCreatedWithFollowingFields
中你只创建了1个对象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);
}
}
你似乎已经编辑了我复制错误所需的大部分/部分信息,我只是根据你提供的内容构建了一个示例并设法获得了所需的输出
您正在 for 循环外为 TimeSlots 创建一个对象,但它应该在循环内
专题文件:
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")...
}