2009-06-03 15 views
22

में अनुरोध पैरामीटर प्राप्त कर रहा है यह संभवतः सभी सोपूआई नियमित के लिए एक बहुत आसान है।सोपयूआई नकली सेवा स्क्रिप्ट

एक सोपयूआई मॉक सेवा प्रतिक्रिया स्क्रिप्ट में, मैं जिस अनुरोध का जवाब दे रहा हूं उसके अंदर मूल्य को कैसे निकाला जाए?

चलो कहते हैं कि आने वाली अनुरोध

<ns1:foo> 
    <ns3:data> 
    <ns3:CustomerNumber>1234</ns3:CustomerNumber> 
    </ns3:data> 
</ns1:foo> 

है मैं "1234" एक ग्रूवी चर में कैसे मिलता है चलो? मैंने xmlHolder के साथ प्रयास किया लेकिन मुझे लगता है कि गलत XPath है।

(मैं कैसे एक गुण सेट और प्रतिक्रिया में अपने मूल्य को एकीकृत करने के पहले से ही जानते हैं।)

उत्तर

28

आप सोप अनुरोध पहुँच सकते हैं और कुछ XPath प्रसंस्करण करना चाहते हैं, वहाँ के लिए soapUI धन्यवाद में यह करने के लिए एक आसान तरीका है GPath और XmlSlurper की शक्ति।

यहाँ कैसे आप ग्राहक संख्या का उपयोग होता है: डिफ़ॉल्ट रूप से

def req = new XmlSlurper().parseText(mockRequest.requestContent) 
log.info "Customer #${req.foo.data.CustomerNumber}" 

ग्रूवी 1.6.3 (जो soapUI 2.5 और उससे आगे में प्रयोग किया जाता है) के रूप में, XmlSlurper में चलाता नाम स्थान-अवगत और गैर मान्य मोड इसलिए आपको कुछ और करने की ज़रूरत नहीं है।

चीयर्स!
Shonzilla

+0

एक्सएमएल-क्यू/ए के बहुत सारे, लेकिन यदि आपके पास JSON अनुरोध है, यह 'def requestJson = new groovy.json.JsonSlurper()। parseText (mockRequest.requestContent)' और उदा। 'log.info" $ {requestJson.'CustomerNumber '} "' – fheub

22

एक और उदाहरण:

def request = new XmlSlurper().parseText(mockRequest.requestContent) 
def a = request.Body.Add.x.toDouble() 
def b = request.Body.Add.y.toDouble() 
context.result = a + b 

इस उदाहरण में हम अनुरोध से दो पैरामीटर और उन्हें डबल्स में बदलने का। इस तरह हम पैरामीटर पर गणना कर सकते हैं। इस उदाहरण के लिए नमूना सोपूआई प्रतिक्रिया है:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://example.org/math/types/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <typ:AddResponse> 
     <result>${result}</result> 
     </typ:AddResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

आप देख सकते हैं कि गणना परिणाम प्रतिक्रिया पर वापस कैसे पारित किया जाता है।

+0

आपके उदाहरण के लिए धन्यवाद! मुझे शोनजिला और आप दोनों के जवाब पसंद हैं! – Thorsten79

0

एक शुद्ध जावा (SoapUI का उपयोग नहीं) तुम सिर्फ इस तरह एक कस्टम नामकरण प्रसंग बन जाएगा में:, तब

import java.util.Iterator; 
import java.util.List; 

import javax.xml.XMLConstants; 
import javax.xml.namespace.NamespaceContext; 

class WSNamespaceContext implements NamespaceContext 
{ 
    public String getNamespaceURI(String prefix) 
    { 
     if (prefix.equals("ns3")) 
      return "http://www.mysite.com/services/taxservice"; 
     else if (prefix.equals("soapenv")) 
      return "http://schemas.xmlsoap.org/soap/envelope/"; 
     else 
      return XMLConstants.NULL_NS_URI; 
    } 

    public String getPrefix(String namespace) 
    { 
     if (namespace.equals("http://www.mysite.com/services/taxservice")) 
      return "ns3"; 
     else if (namespace.equals("http://schemas.xmlsoap.org/soap/envelope/")) 
      return "soapenv"; 
     else 
      return null; 
    } 

    public Iterator<List<String>> getPrefixes(String namespace) 
    { 
     return null; 
    } 
} 

इतना है कि यह पार्स:

XPathFactory factory = XPathFactory.newInstance(); 
XPath xp = factory.newXPath(); 
xp.setNamespaceContext(nsc); 
XPathExpression xpexpr = xp.compile("//ns3:CustomerNumber/text()"); 
NodeList nodes = (NodeList)xpexpr.evaluate(doc, XPathConstants.NODESET); 
for (int i = 0; i < nodes.getLength(); i++) { 
    String val = nodes.item(i).getNodeValue(); 
    System.out.println("Value: " + val ); 
} 
0

http://www.soapui.org/soap-mocking/creating-dynamic-mockservices.html विस्तार और आधार http://www.soapui.org/apidocs/com/eviware/soapui/support/xmlholder.html पर मैं इसके साथ आया:

// Create XmlHolder for request content 
def holder = new com.eviware.soapui.support.XmlHolder(mockRequest.requestContent) 
holder.namespaces["ns3"] = "ns3" 

// Get arguments 
def custNo = holder.getNodeValue("//ns3:CustomerNumber") 
context.setProperty("custNo", custNo) 
संबंधित मुद्दे