SoapUI: dynamischer Mockservice (Teil 2)

Dieser Beitrag soll das Beispiel aus Teil 1 etwas erweitern. Dieses Beispiel befasst sich dabei mit dem Einsatz von Groovy, um die Response eines Mockservices abhängig vom Request zurückzugeben.

Der Zugriff auf Daten aus dem Request erfolgt prinzipiell über XPath-Ausdrücke.
Zur Erinnerung der Request aus den Beispiel:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test.ronnyfriedland.de">
 <soapenv:Header/>
 <soapenv:Body>
    <test:getUserData>
       <id>1</id>
    </test:getUserData>
 </soapenv:Body>
</soapenv:Envelope>

Damit der Mockservice sollte natürlich auch Fehler zurück geben können. Dafür kann man eine Fault-Response erzeugen.

image0

image1

Um die Übersicht zu behalten habe ich die Mock Responses noch umbenannt. Damit sind die Grundlagen für den Mockservice in diesem Beispiel geschaffen.

image2

Jetzt kommen wir zum Groovyskript ... Zu extrahieren der Id aus den Request genügen die folgenden Zeilen:

def holder = new com.eviware.soapui.support.XmlHolder( mockRequest.requestContent )

// get param "id" from request
def param_id = holder["//id"]

Für das Beispiel definiere ich 3 verschiedene Inhalte, welche abhängig von der Id aus dem Request zurück gegeben werden:

  • einstellige ID's (0-9): Nutzer 1
  • zweistellige ID's (10-99): Nutzer 2
  • dreistellige ID's (100-999): Nutzer 3
def holder = new com.eviware.soapui.support.XmlHolder( mockRequest.requestContent )

// get param "id" from request
def id = holder["//id"] as Integer

if(id < 10) {
 // Nutzer 1
 context.id = id
 context.firstname = "Hans 1-" + id
 context.lastname = "Wurst 1-" + id
 mockOperation.setDefaultResponse("Defaultresponse")
} else if(id >= 10 && id < 100) {
 // Nutzer 2
 context.id = id
 context.firstname = "Hans 2-" + id
 context.lastname = "Wurst 2-" + id
 mockOperation.setDefaultResponse("Defaultresponse")
} else if(id >= 100 && id < 1000) {
 // Nutzer 3
 context.id = id
 context.firstname = "Hans 3-" + id
 context.lastname = "Wurst 3-" + id
 mockOperation.setDefaultResponse("Defaultresponse")
} else {
 // Nutzer nicht gefunden -> Fehler werfen
 context.id = id
 mockOperation.setDefaultResponse("Faultresponse")
}