soapUI动态模拟服务:如何从请求参数中提取响应名称?

时间:2016-05-04 13:55:37

标签: xpath soap groovy mocking soapui

我正在尝试在SoapUI中构建一个模拟服务,它根据请求中传递的值动态返回响应。例如:

<foo>
     <bar>
        <ID>Response1</ID>  <--- I want to extract this
        <ReferenceID>stuff</ReferenceID>
        <CreationDate>2016-05-01T11:34:56Z</CreationDate>
     </bar>
</foo>

所以我将DISPATCH设置为SCRIPT并尝试以下操作(返回值应指定响应的名称,并返回):

def req = new XmlSlurper().parseText(mockRequest.requestContent)
return "${req.foo.bar.ID}"

而且:

def holder = new com.eviware.soapui.support.XmlHolder(mockRequest.requestContent )
def arg1 = holder.getNodeValue("ID") // also tried "//ID"
return arg1.toString();

两者都没有工作,模拟总是返回默认响应 - 希望你们中的一些人可以帮我解决问题:)

1 个答案:

答案 0 :(得分:1)

问题可能是您的<foo>响应包含在 SOAP <envelope><body>中,因此您使用{{1}的路径}不正确XmlSlurper

此外,如果在您的情况下,您的回复不是req.foo.bar.ID<envelope>的包装,请注意<body> XmlSlurper节点从对象本身开始,因此{{由于root是根节点,因此不需要1}},请查看以下示例:

req.foo

由于这个,获取节点值的简单方法是使用find方法,所以在您的DISPATCH脚本中:

<foo>

或者,如果您想使用def xml = '''<foo> <bar> <ID>Response1</ID> <ReferenceID>stuff</ReferenceID> <CreationDate>2016-05-01T11:34:56Z</CreationDate> </bar> </foo> ''' def slurper = new XmlSlurper().parseText(xml) println slurper.foo // prints nothing... println slurper.bar.ID // prints Response1 代替def req = new XmlSlurper().parseText(mockRequest.requestContent) return req.'**'.find { it.name() == 'ID' } 作为@Rao注释,只需在 XPath 上使用命名空间即可。幸运的是, SOAPUI 允许您使用XmlHolder作为命名空间的通配符,因此XmlSlurper更正*

ID

希望它有所帮助,