cancel
Showing results for 
Search instead for 
Did you mean: 

SoapUI - How to create dynamic array mock responses for REST call

SOLVED
Highlighted
New Contributor

SoapUI - How to create dynamic array mock responses for REST call

I currently have a REST mock service setup for a POST call that responds with different responses depending on the content of the call, this is all working fine but I need this to be able to handle arrays \ multiple requests and respond with the same sized responses accordingly, I'm wondering if this is possible?

 

My current service works as follows, we send a request as per below...

 

[{
"orderCorrelationId" : "85a64706-49c7-4013-a2d2-cb0502300e2d",
"customerNumber" : "1234",
"testing" : 123,
"lineItems" : [ {
"test_param_1" : "ABC"
}, {
"test_param_1" : "GHI"
} ],
"requestMetaData" : {
"correlationId" : "9333c85d-8bd7-425c-81c8-b6d45b40817a"
}
}]

 

This will respond as follows with the orderCorrelationId being echoed back as part of the response...

 

[{

"orderCorrelationId": "85a64706-49c7-4013-a2d2-cb0502300e2d",
"customerName": null,
"responseStatuses": [
{
"code": "",
"message": "OK",
"severity": "INFO"
}]
}]

 

This all works fine, however if there are multiple orders in the request then the response is singular. I'm looking for a way to make this dynamic so that if we get another order included in the request like...

 

[{
"orderCorrelationId" : "85a64706-49c7-4013-a2d2-cb0502300e2d",
"customerNumber" : "1234",
"testing" : 123,
"lineItems" : [ {
"test_param_1" : "ABC"
}, {
"test_param_1" : "GHI"
} ],
"requestMetaData" : {
"correlationId" : "9333c85d-8bd7-425c-81c8-b6d45b40817a"
}
}, {
"orderCorrelationId" : "a89d13da-064d-4fa2-ad7b-7dfbf8815bbc",
"customerNumber" : "1234",
"testing" : 456,
"lineItems" : [ {
"test_param_1" : "AAA"
}, {
"test_param_1" : "CCC"
} ],
"requestMetaData" : {
"correlationId" : "9333c85d-8bd7-425c-81c8-b6d45b40817a"
}
}]

 

...then the response would also be an array as per below...

 

[{
"orderCorrelationId": "85a64706-49c7-4013-a2d2-cb0502300e2d",
"customerName": null,
"responseStatuses": [
{
"code": "",
"message": "OK",
"severity": "INFO"
}]
},
{
"orderCorrelationId": "a89d13da-064d-4fa2-ad7b-7dfbf8815bbc",
"customerName": null,
"responseStatuses": [
{
"code": "1234",
"message": "Customer is inactive",
"severity": "ERROR"
}]
}]

 

I'm wondering if this is possible? I found some documentation on doing similar using SOAP but not REST. If this is not possible then I will try to build different responses with different array sizes and try using the incoming array size to determine which response to use

 

Any advice or pointers to useful articles would be appreciated, thanks!

1 ACCEPTED SOLUTION

Accepted Solutions
Highlighted
New Contributor

Re: SoapUI - How to create dynamic array mock responses for REST call

Thanks

 

I managed to get this working in the end. I picked up the incoming requests and set them as an array, managed to loop through them and build up a variable containing dynamic responses to each and output the variable as my response. 

 

Here's my code for anyone interested, not the prettiest but did the job

 

// Parse the JSON request.
def jsonrequest = new groovy.json.JsonSlurper().parseText(mockRequest.getRequestContent())

 

// Capture values from request
requestContext.echoOrderCorrelationId = jsonrequest.orderCorrelationId

 

//Define Incoming Array for CorrelationIds 
def myarray = new ArrayList<String>(requestContext.echoOrderCorrelationId)
def arraysize = myarray.size()

 

//set variables for use in while loop
def count = 0
String Response = '['
String Full = ''

while(count < arraysize)
{
//take the correlation ID for item in the loop
def CorrelationID = myarray.get(count)
//write the body of the response for the item in the loop
String Body = '{"orderCorrelationId": "' + CorrelationID + '","customerName": "MOCK Customer","responseStatuses": [{"code": "","message": "OK","severity": "INFO"}]}'

 

//increment the count
count++

//check if last iteration
if (count < arraysize)
{
//add comma to continue adding records
Full = Response + Body + ','
Response = Full
}
else
{
//add ] to finalise response
Full = Response + Body + ']'
Response = Full
}
log.info "Body = ${Response}"
}

//set variable to return for Response Body
requestContext.ResponseBody = Response

 

For my response I just default to an OK and use ${ResponseBody} to output my variable

View solution in original post

2 REPLIES 2
Highlighted
Occasional Contributor

Re: SoapUI - How to create dynamic array mock responses for REST call

Hi @martinh3345 

 

You could try to use some groovy into the "OnRequest Script" of your Mock Service.

And then parse the incoming request and construct your response.

 

Have a look to this page, may be it can help:
https://www.soapui.org/docs/soap-mocking/creating-dynamic-mockservices/

Highlighted
New Contributor

Re: SoapUI - How to create dynamic array mock responses for REST call

Thanks

 

I managed to get this working in the end. I picked up the incoming requests and set them as an array, managed to loop through them and build up a variable containing dynamic responses to each and output the variable as my response. 

 

Here's my code for anyone interested, not the prettiest but did the job

 

// Parse the JSON request.
def jsonrequest = new groovy.json.JsonSlurper().parseText(mockRequest.getRequestContent())

 

// Capture values from request
requestContext.echoOrderCorrelationId = jsonrequest.orderCorrelationId

 

//Define Incoming Array for CorrelationIds 
def myarray = new ArrayList<String>(requestContext.echoOrderCorrelationId)
def arraysize = myarray.size()

 

//set variables for use in while loop
def count = 0
String Response = '['
String Full = ''

while(count < arraysize)
{
//take the correlation ID for item in the loop
def CorrelationID = myarray.get(count)
//write the body of the response for the item in the loop
String Body = '{"orderCorrelationId": "' + CorrelationID + '","customerName": "MOCK Customer","responseStatuses": [{"code": "","message": "OK","severity": "INFO"}]}'

 

//increment the count
count++

//check if last iteration
if (count < arraysize)
{
//add comma to continue adding records
Full = Response + Body + ','
Response = Full
}
else
{
//add ] to finalise response
Full = Response + Body + ']'
Response = Full
}
log.info "Body = ${Response}"
}

//set variable to return for Response Body
requestContext.ResponseBody = Response

 

For my response I just default to an OK and use ${ResponseBody} to output my variable

View solution in original post

New Here?
Join us and watch the welcome video:
Top Kudoed Authors