【问题标题】:SoapUI Mock Service Transfer Multiple NodesSoapUI Mock 服务传输多个节点
【发布时间】:2015-08-12 02:17:42
【问题描述】:

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

基本上,我正在建立一些模拟 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);

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

请帮帮我。 如果我能让这该死的东西起作用,我会给你买啤酒!

【问题讨论】:

  • 我今天要测试一下......过去几周我一直没有和新生儿一起行动!我会及时通知你的!
  • 万岁!胜利!感谢您的输入。我欠你那杯啤酒……
  • 恭喜你的新生儿:),很高兴帮助你!

标签: groovy mocking soapui


【解决方案1】:

我假设您在 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 选项卡上,你希望有必要的脚本来从 request 获取 &lt;Event&gt; 节点并使用 ${events} 属性将其放入 response 中。为此,我建议您可以使用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 中有一些错误。您问题中的请求格式不正确:&lt;/ns2:SetEvents&gt; not close &lt;ns2:setEvents&gt;(注意大写),如果您希望 xmlns:ns2="http://example.com/eventingservices" 命名空间适用于 &lt;SetEvents&gt; 的所有子项,则必须将 ns2 添加到所有子节点或删除 ns2 以使其成为此子树的默认值:&lt;SetEvents xmlns="http://example.com/eventingservices">`(这也适用于您的响应)

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多