Solved! Go to Solution.
Sorry to interrupt Rup.
The details helped Apoorva.
And this is my first try on mocking, followed the video from the same link that I provided earlier.
Here are the steps:
1. Generate a SOAP Mock Service by right click on to the service that you intended ( I believe, you know it already, added this for those who not aware, and this is first time for me too)
2. Selete the intended mock operation.
/*This script reads the salesOrderNumber from request using xpath
* and checks corresponding response xml file from
* mockResponses directory of your soapui project location.
* Also expects a soapFault.xml file in the same location
* in order to send soap fault if no sales order number maches the
* existing files.
* For example, soapui project located under C:\soapuiProjects
* create a subdirectory called mockResponses under above directory
* Make sure all your mock response files for sales orders under
* C:\soapuiProjects\mockResponses directory including soapFault.xml
* Assuming that the soap response file extension is xml, not txt
*/
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context) def holder = groovyUtils.getXmlHolder(mockRequest.requestContent) def soNumber = holder.getNodeValue("//*:BillingOrderLoadRequest/*:salesOrderNumber") def file = new File (groovyUtils.projectPath+"/mockResponses/${soNumber}.xml") def fileToLoad = 'soapFault' if (file.exists()) { fileToLoad = soNumber } context.content = groovy.xml.XmlUtil.serialize(new XmlParser().parse(groovyUtils.projectPath+"/mockResponses/${fileToLoad}.xml"))
Sample soapFault.xml
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <Body> <Fault> <faultcode xsi:type="xsd:string">Client</faultcode> <faultstring xsi:type="xsd:string">Could not find the mock response file for the given sales order number</faultstring> </Fault> </Body> </Envelope>
Your mock-response should be a groovy script. There you can read in your file (filename based on the submitted ordernumber) and then you have to set an internal variable like this:
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context );
def holder = groovyUtils.getXmlHolder(mockRequest.requestContent);
String sInputOrderNumber = holder.getNodeValue("//<... here you need the tag from incomming request>");
lUtil.log(LogUtil.LogLevel.INFO, " Incomming ordernumber: " + sInputOrderNumber);
...
// read correct file based on ordernumber
String sResult = ... getOrderNumberResult( sInputOrderNumber );
// set context variable
context.setProperty("result", sResult);
Then, in your mock-response, you only put something like this:
${result}
That means, whatever you read in from your file will be returned to the caller. That also means tha you should have your complete returnmessage in your mock-file.
( P.S.: Of course, you can have your retunr message in the response and only put the return variable there it belonged in the message.)
Hi,
Sorry to hop in, but assuming you're happy to extract the file name from the mockRequest (using Groovy), then does the following give you what you need:
1. In your mock action, create a new Mock MockResponse with dispatch type 'SEQUENCE' e.g. called 'default'
2. In the MockResponse (default) add a script e.g.
def fileName = "1234.txt" //Extract this value from the request (ask if you need help) def responseFileContent = new StringBuilder() File testDataFile = new File("/Users/test/$fileName") //Load file containing test data response testDataFile.eachLine {content, lineNumber -> responseFileContent.append(content) //Add each line of test data file to a String } mockResponse.responseContent=responseFileContent //Populate response body mockResponse.responseHttpStatus=200 //set status code (can also be done in UI) def headers = mockResponse.responseHeaders headers["Content-Type"]=["text/xml"] mockResponse.responseHeaders=headers //Headers can also be set in the UI
Here is a screen shot:
This should load and despatch the contents of the file /Users/test/1234.txt as the body of the mock response. All that should then be needed is for you to add some script before my script to set fileName to the value you want to extract from the mockRequest object (let me know if you need any help with this). Setting the responseHttpStatus and responseHeaders is optional, as it can be set in the Mock Response UI - I added it as it can be useful in the case where you want to conditionally simulate error / 404 / 500 statuses or respond with different content types!
Hope this helps,
Rupert
Hi,
Ok, sorry, in that case I'm not totally sure what you need..
Where you say compare order number, compare file names, load the matching file - I take that to mean something like:
1. Request is made to your mock
2. You extract the ordernumber from the request
3. Build a file path to load the ordernumber.txt file (shown in the sample I provided)
Is this what you mean? Then what do you want to do? Since the title of the post says 'get soap mock response from external file' - I was thinking you would then want to despatch the loaded file contents as the mock's response?
Just to clear myself again.
I have ordernumber tag in request . it can have multiple input values (dynamic) say $ordnb. All the time I need to check if ($ordnb).txt file is present in the path C:Users/test path or not. If present I need to load mock response from ($ordnb).txt file. Else throw an error as Response not found in response.
Subject | Author | Latest Post |
---|---|---|