1

I'm trying to send nested JSON through Cucumber data table. I have the following scenario, I have tried Scenario Outline too but it didn't resolve the issue.

  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 I have the following step definition

 @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")));

              }

Actual output is :

{
    "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
}

Expected output is :

{
    "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
}
2
  • 2
    I don't know the details, but your current step creates one TimeSlot, then updates the data in that object repeatedly. Instead, you'll need to instantiate an array of TimeSlots, create new TimeSlots in your for loop, and append to the array.
    – ernie
    Jul 23, 2021 at 21:39
  • Totally agree with @ernie, in the step implementation you create only one TimeSlot object, while you need to create an ArrayList<TimeSlot> outside the loop, and then for each of loop iteration create new TimeSlot set all its fields and add it to the created list. Try moving table conversions out of step implementation if possible. Sep 7, 2021 at 2:44

1 Answer 1

0

You can try storing the JSON data in separate files (e.g., actual_data1.json, etc). And then reference only the JSON filename in the feature file. Lastly in the step definition class you can write logic to extract data from mentioned JSON file to java object. So your feature file would be something like,

(pseudo code)

Scenario Outline: some scenario description

Given I setup something
When I do something <actual_data>
Then I expect something <expected_data>

Examples:

| actual_data      | expected_data      |
| actual_data.json | expected_data.json |

Step Definition:

@When("I do something (.*)")
public void doSomething(String actualData)
{
    JsonDataClass actualDataObject = getDataFromJsonFile(actualData); 
    //create this method to write logic to load json data from mentioned filename
    ...
}
1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.