SoapUI
SoapUI is a free and open source cross-platform Functional Testing solution.
Rest OnRequest sample Groovy
http://www.soapui.org/apidocs/com/eviware/soapui/impl/rest/mock/RestMockRequest.html
http://www.soapui.org/apidocs/com/eviware/soapui/impl/rest/mock/RestMockResult.html
https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html
https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
import com.eviware.soapui.impl.rest.mock.RestMockResult RestMockResult res = new RestMockResult( mockRequest ) String val ="{test:1234}" mockRequest.httpResponse.writer << val mockRequest.httpResponse.status = 200 mockRequest.httpResponse.header = "Content-type: application/json" mockRequest return res
WAR generation from SoapUI project
SoapUI is able to generate a WAR to create mock servers to run on Tomcat. The SoapUI project is stored inside the WAR in WEB-INF/soapui/soapuiprj.xml .
Sample onRequest script to call groovy scripts inside WEB-INF/soapui/. They can be changed on runtime after Tomcat has exploded the WAR file.
Inside the onRequestScript
import groovy.util.GroovyScriptEngine import com.eviware.soapui.support.GroovyUtils def gru = new GroovyUtils(context) GroovyScriptEngine ge = new GroovyScriptEngine(gru.projectPath) Binding b = new Binding() b.setVariable("mockRequest", mockRequest); ge.run( "scriptx.groovy" , b )
scriptx.groovy
import com.eviware.soapui.impl.rest.mock.RestMockResult RestMockResult res = new RestMockResult( mockRequest ) println "Message in tomcat console" def servletContext = mockRequest.httpRequest.getServletContext() println servletContext.getServerInfo() println servletContext.getServletContextName() servletContext.log("servlet context log") //INFO: in file logs\localhost.XXXX.log in apache String paramx = mockRequest.httpRequest.getParameter("paramx") String rendered = String.format("<html><body><p>Page with %s</p></body></html>",paramx) mockRequest.httpResponse.writer << rendered mockRequest.httpResponse.setStatus(200) mockRequest.httpResponse.setContentType("text/html") mockRequest.httpResponse.setContentLength( rendered.length() )
Install SOAP UI
wget https://s3.amazonaws.com/downloads.eviware/soapuios/5.5.0/SoapUI-x64-5.5.0.sh
- sh SoapUI-x64-5.5.0.sh
Mock REST service
- File, Create empty project
- New REST Mock service
- right mouse button, Add new mock action
- add new mock response tothe action
- define response {"key":"hello world"}
- define status 200 and media type application/json
- show rest mock service, click play green triangle
https://www.soapui.org/soap-mocking/creating-dynamic-mockservices/
Dispatch script for action that has a Default response , in the MockResponse script area add the stuff below
import com.eviware.soapui.impl.rest.mock.RestMockResult def getNumberArgument(){ def requestPath = mockRequest.getPath() def split = requestPath.tokenize('/') def index =0 for(item in split){ if(item=="number"){ break } index++ } def nr = split[index+1].toInteger() return nr } def buildResponse(nr){ def val ="" if(nr % 2 ==0){ val = '{"number":"evenxy"}' } else{ val = '{"number":"oddxy"}' } log.info("called build resp") return val } def createMockResponse(status,contentType,payload){ RestMockResult res = new RestMockResult( mockRequest ) // HttpServletResponse // ServletResponse response = mockRequest.httpResponse response.setStatus(status) response.setContentType(contentType) response.writer.print(payload) response.writer.flush() return res } def nr = getNumberArgument() def val = buildResponse(nr) def res = createMockResponse(200,"application/json",val) return res
test endpoint
- create new mock action test inside rest mock service
- create new mock response Default inside action
- in default in the script tab add the following
import com.eviware.soapui.impl.rest.mock.RestMockResult RestMockResult res = new RestMockResult( mockRequest ) String paramx = mockRequest.httpRequest.getParameter("paramx") String rendered = String.format("<html><body><p>Page with %s</p></body></html>",paramx) mockRequest.httpResponse.writer.print(rendered) mockRequest.httpResponse.writer.flush() mockRequest.httpResponse.setStatus(200) mockRequest.httpResponse.setContentType("text/html") mockRequest.httpResponse.setContentLength( rendered.length() )
- run the mock rest service
access using http://localhost:8080/test?paramx=asdf
get json endpoint
- create new mock action test inside rest mock service
- create new mock response Default inside action
- in default in the script tab add the following
import com.eviware.soapui.impl.rest.mock.RestMockResult import groovy.json.JsonOutput /* comment*/ // comment httpRes = mockRequest.httpResponse class Out{ int id String name } class Other{ Out[] stuff } String paramx = mockRequest.httpRequest.getParameter("paramx") def elements = [ new Out(id:1,name:"aaaak1") ] elements << new Out(id:2,name: paramx ) elements.add( new Out(id:3,name:"aaaak3") ) def data = new Other(stuff : elements) log.info( data.stuff.size() ) log.info( data.stuff.getClass() ) String payload = JsonOutput.toJson(data) httpRes.setStatus(404) httpRes.setContentType("application/json") httpRes.setContentLength( payload.length() ) httpRes.writer.print(payload) httpRes.writer.flush()
multipart form data
curl -v -X POST -F 'paramx=hello' -F 'aaaa=bbbkkk' -F 'UploadedFiles=@/home/user/ldap.txt' http://localhost:8080/formdatatest
import com.eviware.soapui.impl.rest.mock.RestMockResult def values="" for(def attach in mockRequest.getRequestAttachments() ){ log.info( attach.getAttachmentType().toString() ) log.info("name " + attach.getName() ) log.info("part " + attach.getPart() ) log.info("content type " + attach.getContentType() ) def r = new BufferedReader( new InputStreamReader(attach.getInputStream() ) ) def line="" while(line != null){ line = r.readLine() if(line!=null){ values += " " + line } } } String payload = " <<<<<<<< " + values + ">>>>>>>>> \n" log.info(payload) httpRes = mockRequest.httpResponse httpRes.setStatus(200) httpRes.setContentType("text/plain") httpRes.setContentLength( payload.length() ) httpRes.writer.print(payload) httpRes.writer.flush()