Friday, 12 April 2013

Rest Web-Service Mocking using soapUI

Tutorial on How to create REST Web-Service Mocking Using soapUI







For Creating a REST Web-Service Mock Project Using soapUI 4.5.1

            ***Steps for Creating Rest Web-Service Mock project***

            (1) Open soapUI with Empty workspace as below.



(2)   Select New soapUI projectoption from soapUI File menu.



(3) Import the wadl file in soapUI like below:-   



Note :- Check mark in Creates a TestSuite for the imported WSDL and WADL will default  
             create request for the available services.

  
application WADL File contents:-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://research.sun.com/wadl/2006/10">
    <doc xmlns:jersey="http://jersey.dev.java.net/" jersey:generatedBy="Jersey: 1.4 09/11/2010 10:41 PM"/>
    <resources base="http://localhost:9070/Rest-Sample/rest/">
        <resource path="HelloExample">
            <method name="GET" id="sayPlainTextHello">
                <response>
                    <representation mediaType="text/plain"/>
                </response>
            </method>
            <method name="GET" id="sayXMLHello">
                <response>
                    <representation mediaType="text/xml"/>
                </response>
            </method>
            <method name="GET" id="sayHtmlHello">
                <response>
                    <representation mediaType="text/html"/>
                </response>
            </method>
            <method name="GET" id="sayJSONHello">
                <response>
                    <representation mediaType="application/json"/>
                </response>
            </method>
        </resource>
    </resources>
</application>


(4)   Click on OK will display the below dialog box:-
            Note: - Select Single TestCase with one Request for each methodoption and click on OK.
 



(5)   After click on OK, will display a new dialog box as below:-


  

    


   
   Note:- Now after importing the WADL file the project will appear as below:-

 

Note: - As we have 4 types of services according to WADL file, So here we can see the 4 test steps created bydefault inside the TestSuite. The available services as per WADL are
sayPlainTextHello, sayXMLHello, sayHtmlHello and sayJSONHello.

(6)   Right click on the project Sample_Rest_Mockingand select New MockService option.



(7)   After click on New MockService option, provide any name in the below text box:



(8)   Right Click on SampleMockServiceand select the option Show MockService Editor. Screen will appear as below:-

      


    (9) Click on Sets Options for this MockService, In the below fig. we can see the option.

      



(10)   After click on  Sets Options for this MockService, the window will appear as below:-

     



Here the Path “/”is responsible to handle all the request URL, If we will configure the path like above then it will serve all request services coming from different-different URL's in soapUI, but if we need to deploy this soapUI project as a war file in any servlet container then it will not work, The reason behind this is while making war of this soapUI project, a component is generated which is com.eviware.soapui.mockaswar.MockAsWarServlet, and This class is acting like dispatcher servlet, In this class, Inside dispatchRequest method, a condition is defined which is given below:-

pathInfo.equals( mockRunner.getMockService().getPath() )

Here pathInfo is the request path(URL) and mockRunner.getMockService().getPath() is the value of Path attribute which we mentioned above during MockService configuration. If both path's are equal then only OnRequest Script will get triggered otherwise OnRequest script will not get triggered (as we are writing the Mock Response representation codes in OnRequest Script in MockService Editor). So if OnRequest script will not get triggered we are not able to get responses after sending available requests.

So if we have to deploy this MockService in any ServletContainer then we need to create a war for this soapUI project at that time it is good to define separate MockServices for handling each request URL. Otherwise the value for path attribute is Ok as “/”, if we want to execute only in soapUI(If we don't want to deploy in any servers).



(11)  Configure the MockService attribute values as below:-




Here Docroot is the path where I kept my response files.

${ProjectDir} for example:- C:\sample-Rest-Mockingwhere i saved this soapUI project.

C:\sample-Rest-Mocking/docroot/- Path where I placed my response files.


(12) Place the required code in MockService – OnRequestScript. Below is the source     
       code which I placed in MockService  OnRequestScript(Screenshot is attached below).


Source Code:-

     def queryString = mockRequest.getHttpRequest().getQueryString()
 
     def httpResponse = mockRequest.httpResponse
 
     def mediaType = mockRequest.getHttpRequest().getHeader("Accept")  
 
     def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)

     //This variable is used to get the soapui project path
    
     def path = groovyUtils.projectPath + "/docroot/"

    log.info "projectPath-->"+path
  
   if (mockRequest.getMethod() == "GET" && mediaType=="application/json"){
      
    mockRunner.returnFile(httpResponse,new File(path + "JSONResponse.js"))
    log.info "Response returning for Content-Type application/json"
    return new com.eviware.soapui.impl.wsdl.mock.WsdlMockResult(mockRequest)
   
    }

          if (mockRequest.getMethod() == "GET" && mediaType=="text/plain"){
   
    mockRunner.returnFile(httpResponse,new File(path + "test.txt"))
    log.info "Response returning for Content-Type text/plain"
    return new com.eviware.soapui.impl.wsdl.mock.WsdlMockResult(mockRequest)
   
    }

    if (mockRequest.getMethod() == "GET" && mediaType=="text/xml"){
   
    mockRunner.returnFile(httpResponse,new File(path + "User.xml"))
    log.info "Response returning for Content-Type text/xml"
    return new com.eviware.soapui.impl.wsdl.mock.WsdlMockResult(mockRequest)
   
    }

     if (mockRequest.getMethod() == "GET" && mediaType=="text/html"){
   
    mockRunner.returnFile(httpResponse,new File(path + "htmlSuccess.html"))
    log.info "Response returning for Content-Type text/html"
    return new com.eviware.soapui.impl.wsdl.mock.WsdlMockResult(mockRequest)
   
    }
 



(13)       Now Click on the Option Starts this MockService on the specified port and 
            endpoint  (Green button) in SampleMockService.



(14)    Double click on HelloExampleRest Request:-

Note :- Endpoint is http://localhost:6080, here 6080 is the port-number where our mockservice is  
            running as we have seen in above steps. After sending the request the output will appear as   
            below:-

Mock Response of HelloExampleRequest where Content-Type is text/plain:-


Plain Text Mock Response :-

<data contentType="text/plain" contentLength="73">
<![CDATA[Hello by text document, It's a sample example using soapUI Rest Mocking]]>
</data>



Note :-Make a txt file with any content and name it as  test.txt and place inside docroot directory where you saved this current soapUI project in FileSystem. For example : - this soapUI project saved location is C:\sample-Rest-Mocking  and soapUI mock response path is like C:\sample-Rest-Mocking\docroot.




(15)  Now send other requests like HelloExample 1, HelloExample 2, HelloExample 3 sequencially.


The Mock Response is as below:-

     Mock Responseof HelloExample 1 Request where Content-Type is text/xml :-

XML Mock Response :-

     <xml>
          <user>
                   <username>Gaurav</username>
                   <password>123@**</password>
          </user>
     </xml>

Note :-Save this content as User.xml and place inside docroot directory where you saved this current soapUI project in FileSystem. For example : - this soapUI project saved location is C:\sample-Rest-Mocking  and soapUI mock response path is like C:\sample-Rest-Mocking\docroot.




Mock Response of HelloExample 2Request where Content-Type is text/html :-

HTML Mock Response :-

     <html>
          <head/>
              <title>MySuccessPage</title>
              <body>Hello Rest Service</body>
     </html>

Note :-Save this content as htmlSuccess.html and place inside docroot directory where you saved this current soapUI project in FileSystem. For example : - this soapUI project saved location is C:\sample-Rest-Mocking  and soapUI mock response path is like C:\sample-Rest-Mocking\docroot.




Mock Response of HelloExample 3Request where Content-Type is application/json :-

JSON Mock Response :-

{"state": {
   "name": "India",
   "state": "Andhra Pradesh",
   "pincode": 500048,
   "capital": "Delhi",
   "majorCities":    [
      "Mumbai",
      "Kolkata",
      "Chennai",
      "Bangalore",
      "Hyderabad"
   ]
}} 

Note :-Save this content as JSONResponse.js and place inside docroot directory where you saved this current soapUI project in FileSystem. For example : - this soapUI project saved location is C:\sample-Rest-Mocking  and soapUI mock response path is like C:\sample-Rest-Mocking\docroot.





Finished 

Note - In the continuation with REST web-service mocking, very soon i will post tutorial for how to generate dynamic mock responses using soapUI.








2 comments:

  1. Hi Kumar,
    I have followed the steps what u have given in "
    REST web-service With CRUD Operations Using Spring and Hibernate" but I am getting this error "org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.IllegalAccessError: tried to access method net.sf.ehcache.CacheManager.()V from class org.hibernate.cache.EhCacheProvider"
    please help me here, how to solve this.

    Thanks,
    sayed

    ReplyDelete
  2. I am trying to mock the HTTP POST operation without using any groovy script. Is there any easy way to do it using soap ui?

    ReplyDelete