【发布时间】:2010-12-09 12:55:47
【问题描述】:
我正在编写一个 Spock 测试,其中我有一个 REST Web 服务,它返回这样的 XML:
<templates>
<userTemplate id="1109">
<settingsXml/>
<type>USER</type>
<label>template111</label>
<description>template111</description>
</userTemplate>
<userTemplate id="1141" isAutomaticTemplate="true">
<settingsXml/>
<type>USER</type>
<label>An updated user template</label>
</userTemplate>
</templates>
我的测试想要验证一个特定的 userTemplate 它在这个文档中不是。因此,使用 HTTP Builder 的 REST 客户端和 XMLSlurper,我正在执行以下操作:
res = settingsService.get(path: "templates")
res.status == 200
def delTemplate = res.data.userTemplate.find {
println it.@id == newUserTemplateId
it.@id == newUserTemplateId
}
delTemplate
我原以为 delTemplate 在调用 find 后会为空(因为没有具有该 id 的模板;表达式 println it.@id == newUserTemplateId 总是打印false,在这种情况下 newUserTemplateId 的值为 1171)。
但是,delTemplate 的类型是 groovy.util.slurpersupport.NoChildren,而且它似乎包含一个 userTemplate 元素。
有趣的是,如果我使用与文本相同的 XML 编写一个快速脚本(而不是从 REST 读取它),res.userTemplate.find { it.@id == 1171 } 会按预期返回 null。
我做错了什么,或者我该如何解决?
【问题讨论】:
-
那么您的服务是否返回 XMLSlurper 对象?
-
据我所知确实如此。 RESTClient 返回一个groovy.codehaus.org/modules/http-builder/apidocs/groovyx/net/…,响应数据已经解析为一个 XMLSlurper 对象。我现在已经解决了这个问题,通过使用 findAll() 然后检查 isEmpty(),但我仍然很好奇为什么它不适用于 find() 并检查 null。
标签: xml groovy xmlslurper httpbuilder