2014-05-22 2 views
0

J'essaie de faire une réponse fictive en fonction de la demande. Avec une demande comme ça:Faux réponse avec des répétitions dans soapui

<soapenv:Body> 
    <con:person> 
    <person> 
     <name>John</name> 
     <age>18</age> 
    </person> 
    </con:person> 
</soapenv:Body> 

et que Reponse comme

<soapenv:Body> 
    <con:result> 
    <person> 
     <name>?</name> 
     <age>?</age> 
     <country>?</country> 
     <city>?</city> 
    </person> 
    </con:result> 
</soapenv:Body> 

Je peux utiliser des éléments de la demande de prendre ce que je veux dans la base de données et de créer la réponse. Mais quand j'ai une demande avec beaucoup de personnes comme

<soapenv:Body> 
    <con:person> 
    <person> 
     <name>John</name> 
     <age>18</age> 
    </person> 
    <person> 
     <name>Doe</name> 
     <age>50</age> 
    </person> 
    </con:person> 
</soapenv:Body> 

Je ne sais pas comment je peux prendre toutes les données de la demande et comment je peux les utiliser pour créer une réponse comme ça:

<soapenv:Body> 
    <con:result> 
    <person> 
     <name>John</name> 
     <age>18</age> 
     <country>France</country> 
     <city>Paris</city> 
    </person> 
    <person> 
     <name>Doe</name> 
     <age>50</age> 
     <country>Spain</country> 
     <city>Madrid</city> 
    </person> 
    </con:result> 
</soapenv:Body> 

Avec le même nombre de personnes dans la demande et dans la réponse.

J'espère avoir été clair et je vous remercie pour vos réponses.

Répondre

2

J'ai réussi à faire quelque chose de similaire. Tout d'abord, je définissais mon objet de réponse simulée comme:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stac="stackOverflow.question"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <stac:result> 
     ${personElements} 
     </stac:result> 
    </soapenv:Body> 
</soapenv:Envelope> 

J'ai ensuite créé le contenu pour ${personElements} en utilisant ce script Groovy:

import groovy.xml.MarkupBuilder 

// An array from which county and city will be drawn randomly 
def countryArray = [["Australia", "Perth"], 
    ["Spain", "Madrid"], 
    ["England","London"], 
    ["Brazil", "Rio"]] 

def random = new Random() 

// create XmlHolder for request content 
def holder = new com.eviware.soapui.support.XmlHolder(mockRequest.requestContent) 

// Get the name and age values from the request 
def requestItems = holder.getNodeValues("//*:person/*:person/descendant::*") 

def writer = new StringWriter() 
def personElements = new MarkupBuilder(writer) 

// Build the response elements 
for (int index = 0; index < requestItems.size() - 1; index += 2) { 

    personElements.'stac:person'() { 

     'stac:name'(requestItems[index]) 
     'stac:age'(requestItems[index+1]) 

     // Choose a random county and city from the array 
     def randomIndex = random.nextInt(countryArray.size()) 
     'stac:country'(countryArray[randomIndex][0]) 
     'stac:city'(countryArray[randomIndex][1]) 
    } 
} 

// Add the newly created elements to the response 
context.personElements = writer.toString() 

Cela m'a donné une réponse comme:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stac="stackOverflow.question"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <stac:result> 
     <stac:person> 
      <stac:name>Dolly Bonkers</stac:name> 
      <stac:age>42</stac:age> 
      <stac:country>Brazil</stac:country> 
      <stac:city>Rio</stac:city> 
     </stac:person> 
     <stac:person> 
      <stac:name>Mary Poppins</stac:name> 
      <stac:age>82</stac:age> 
      <stac:country>England</stac:country> 
      <stac:city>London</stac:city> 
     </stac:person> 
     <stac:person> 
      <stac:name>Bilbo Baggins</stac:name> 
      <stac:age>102</stac:age> 
      <stac:country>Australia</stac:country> 
      <stac:city>Perth</stac:city> 
     </stac:person> 
     <stac:person> 
      <stac:name>Johnny Hardcase</stac:name> 
      <stac:age>22</stac:age> 
      <stac:country>Spain</stac:country> 
      <stac:city>Madrid</stac:city> 
     </stac:person> 
     </stac:result> 
    </soapenv:Body> 
</soapenv:Envelope> 

Le script prend juste les valeurs de ville et de pays aléatoires d'un petit tableau mais vous pourriez trouver quelque chose de mieux si vous vouliez des réponses cohérentes pour certains noms.

Questions connexes