user2434692
user2434692

Reputation: 143

Rest Assured - Post nested POJO in Body

I'm trying to write an API class to send requests and handle responses from an API. Parts of the API have requests that require JSON bodies attached to the request such as this sample:

{
  "Title": "string",
  "Status": "string",
  "ActFinish": "Date",
  "ActHrs": "float",
  "ActStart": "Date",
  "ActualResults": "string",
  "AssigneeUserId": "int",
  "CustomFields": [
    {
      "Id": "string",
      "Name": "string",
      "Value": "string"
    }
  ],
  "Description": "string",
  "EstFinish": "Date",
  "EstHrs": "float",
  "EstHrsRemaining": "float",
  "EstStart": "Date",
  "ExpectedResults": "string",
  "FolderId": "int",
  "FunctionalAreaCode": "string",
  "HowFoundCode": "string",
  "IssueCode": "string",
  "ModuleCode": "string",
  "PctComplete": "int",
  "PriorityCode": "string",
  "Resolution": "string",
  "ResolutionCode": "string",
  "SeverityCode": "string",
  "SoftwareVersionCode": "string",
  "StepsToRepro": "string"
}

The best way to do this I found through reading the Rest Assured documentation is with POJOs mentioned here: https://github.com/rest-assured/rest-assured/wiki/Usage#serialization

My POJO looks like this:

public class RequestDefectPost {

    public String title;
    public String status;
    public Timestamp actFinish;
    public float actHours;
    public Timestamp actStart;
    public String actualResults;
    public int assigneeUserId;
    public String[] customFields;
    public String id;
    public String name;
    public String value;
    public String description;
    public Timestamp estFinish;
    public float estHours;
    public float estHrsRemaining;
    public Timestamp estStart;
    public String expectedResults;
    public int folderId;
    public String functionalAreaCode;
    public String howFoundCode;
    public String issueCode;
    public String moduleCode;
    public int pctComplete;
    public String priorityCode;
    public String resolutionCode;
    public String severityCode;
    public String softwareVersionCode;
    public String stepsToRepro;

    public RequestDefectPost(String title, String status) {

        this.title = title;
        this.status = status;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Timestamp getActFinish() {
        return actFinish;
    }

    public void setActFinish(Timestamp actFinish) {
        this.actFinish = actFinish;
    }

    public float getActHours() {
        return actHours;
    }

    public void setActHours(float actHours) {
        this.actHours = actHours;
    }

    public Timestamp getActStart() {
        return actStart;
    }

    public void setActStart(Timestamp actStart) {
        this.actStart = actStart;
    }

    public String getActualResults() {
        return actualResults;
    }

    public void setActualResults(String actualResults) {
        this.actualResults = actualResults;
    }

    public int getAssigneeUserId() {
        return assigneeUserId;
    }

    public void setAssigneeUserId(int assigneeUserId) {
        this.assigneeUserId = assigneeUserId;
    }

    public String[] getCustomFields() {
        return customFields;
    }

    public void setCustomFields(String id, String name, String value) {
        this.customFields = new String[]{this.id = id, this.name = name, this.value = value};
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Timestamp getEstFinish() {
        return estFinish;
    }

    public void setEstFinish(Timestamp estFinish) {
        this.estFinish = estFinish;
    }

    public float getEstHours() {
        return estHours;
    }

    public void setEstHours(float estHours) {
        this.estHours = estHours;
    }

    public float getEstHrsRemaining() {
        return estHrsRemaining;
    }

    public void setEstHrsRemaining(float estHrsRemaining) {
        this.estHrsRemaining = estHrsRemaining;
    }

    public Timestamp getEstStart() {
        return estStart;
    }

    public void setEstStart(Timestamp estStart) {
        this.estStart = estStart;
    }

    public String getExpectedResults() {
        return expectedResults;
    }

    public void setExpectedResults(String expectedResults) {
        this.expectedResults = expectedResults;
    }

    public int getFolderId() {
        return folderId;
    }

    public void setFolderId(int folderId) {
        this.folderId = folderId;
    }

    public String getFunctionalAreaCode() {
        return functionalAreaCode;
    }

    public void setFunctionalAreaCode(String functionalAreaCode) {
        this.functionalAreaCode = functionalAreaCode;
    }

    public String getHowFoundCode() {
        return howFoundCode;
    }

    public void setHowFoundCode(String howFoundCode) {
        this.howFoundCode = howFoundCode;
    }

    public String getIssueCode() {
        return issueCode;
    }

    public void setIssueCode(String issueCode) {
        this.issueCode = issueCode;
    }

    public String getModuleCode() {
        return moduleCode;
    }

    public void setModuleCode(String moduleCode) {
        this.moduleCode = moduleCode;
    }

    public int getPctComplete() {
        return pctComplete;
    }

    public void setPctComplete(int pctComplete) {
        this.pctComplete = pctComplete;
    }

    public String getPriorityCode() {
        return priorityCode;
    }

    public void setPriorityCode(String priorityCode) {
        this.priorityCode = priorityCode;
    }

    public String getResolutionCode() {
        return resolutionCode;
    }

    public void setResolutionCode(String resolutionCode) {
        this.resolutionCode = resolutionCode;
    }

    public String getSeverityCode() {
        return severityCode;
    }

    public void setSeverityCode(String severityCode) {
        this.severityCode = severityCode;
    }

    public String getSoftwareVersionCode() {
        return softwareVersionCode;
    }

    public void setSoftwareVersionCode(String softwareVersionCode) {
        this.softwareVersionCode = softwareVersionCode;
    }

    public String getStepsToRepro() {
        return stepsToRepro;
    }

    public void setStepsToRepro(String stepsToRepro) {
        this.stepsToRepro = stepsToRepro;
    }
}

With my current POJO, the JSON being spit out by Rest Assured looks like this:

{
  "title": "Test",
  "status": "New",
  "actFinish": null,
  "actHours": 0.0,
  "actStart": null,
  "actualResults": null,
  "assigneeUserId": 0,
  "customFields": [
    "Test",
    "test",
    "tesT"
  ],
  "id": "Test",
  "name": "test",
  "value": "tesT",
  "description": null,
  "estFinish": null,
  "estHours": 0.0,
  "estHrsRemaining": 0.0,
  "estStart": null,
  "expectedResults": null,
  "folderId": 0,
  "functionalAreaCode": null,
  "howFoundCode": null,
  "issueCode": null,
  "moduleCode": null,
  "pctComplete": 0,
  "priorityCode": null,
  "resolutionCode": null,
  "severityCode": null,
  "softwareVersionCode": null,
  "stepsToRepro": null
}

My question is how do I write the the customFields such that it is nested correctly, as outlined in the sample JSON?

Upvotes: 0

Views: 3853

Answers (1)

Johan
Johan

Reputation: 40500

You need another POJO that represents a "CustomFields". For example:

public class CustomFields {
     private String Id;
     private String Name;
     private String Value;

     <getters and setters>
}

and use List<CustomFields> CustomFields instead of String[] customFields. Also note that your JSON example doesn't use camel case for the property names so your POJO shouldn't use camel case either.

There are ways to avoid using a POJO at all in REST Assured. You can for example use a HashMap instead which could be easier in some situations.

Upvotes: 2

Related Questions