SoapUI模拟服务传输多个节点

时间:2015-08-12 02:17:42

标签: groovy mocking soapui

我在泡菜中。 我觉得我想要实现的目标有一个简单的解决方案,但我不知道如何去做。

基本上,我正在提供一些模拟Soap服务。 我想回传一个传入的更新调用。

我的请求如下:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
   <soap:Body>
      <ns2:setEvents xmlns:ns2="http://example.com/eventingservices" xmlns:ns3="http://example.com/eventing/sdo">
         <setEventsRequest>
            <SystemCode>ABC</SystemCode>
            <Event>
               <EventTypeCode>01</EventTypeCode>
            </Event>
            <Event>
               <EventTypeCode>04</EventTypeCode>
            </Event>
         </setEventsRequest>
      </ns2:SetEvents>
   </soap:Body>
</soap:Envelope>

然后我想简单地将事件列表转移到响应中。它们与请求具有相同的属性。

典型的回答如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
   <soapenv:Body>
      <qu:setEventsResponse xmlns:qu="http:/example.com/eventingServices">
         <setEventsResponse>
            <Event>
               <EventTypeCode>01</EventTypeCode>
            </Event>
            <Event>
               <EventTypeCode>04</EventTypeCode>
            </Event>
         </setEventsResponse>
      </qu:setEventsResponse>
   </soapenv:Body>
</soapenv:Envelope>

我尝试使用以下Groovy脚本,用$ {events}替换响应中的事件:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def holder = groovyUtils.getXmlHolder(mockRequest.requestContent)
def events = String.valueOf(holder.getNodeValues("//Event"))

context.setProperty("events", events);

我也尝试了上面没有做过的字符串。无济于事。

请帮助我。 如果我能让这个该死的东西上班,我会给你买啤酒!

1 个答案:

答案 0 :(得分:0)

我想你在SOAPUI中有一个模拟服务配置如下。

操作的响应类似于:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
   <soapenv:Body>
      <setEventsResponse xmlns="http:/example.com/eventingServices">
         <setEventsResponse>
            ${events}
         </setEventsResponse>
      </setEventsResponse>
   </soapenv:Body>
</soapenv:Envelope>

在您的mockService的onRequestScript标签上,您希望拥有必要的脚本来获取<Event>中的request个节点,并使用{response将其放入${events} {1}}财产。为此,我建议您使用XmlSlurper,如下所示:

import groovy.xml.StreamingMarkupBuilder

// parse the request
def reqSlurper = new XmlSlurper().parseText(mockRequest.requestContent)
// find all 'Event' nodes from request
def events = reqSlurper.depthFirst().findAll { it.name() == 'Event' }

// builder to convert the nodes to string
def smb = new StreamingMarkupBuilder() 

// concatenate in the string all "<Event>" nodes from request
def eventAsString = ''
events.each{
    eventAsString += smb.bindNode(it)
}

// set the property to use in the response
context.setProperty("events", eventAsString);

这一切都是为了让它发挥作用:)

另请注意,xmls中存在一些错误。您的问题中的请求格式不正确:</ns2:SetEvents>未关闭<ns2:setEvents>(请注意大写),如果您希望xmlns:ns2="http://example.com/eventingservices"命名空间适用于<SetEvents>的所有子项,则将ns2添加到所有子节点或删除ns2以使其成为此子树的默认值:<SetEvents xmlns="http://example.com/eventingservices"&gt;`(这也适用于您的响应)

希望它有所帮助,