【问题标题】:Finding XML element from RESTClient with XMLSlurper使用 XMLSlurper 从 RESTClient 中查找 XML 元素
【发布时间】: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


【解决方案1】:

我使用带有 XMLSlurper 的 httpBuilder 来对其余 Web 服务进行 JUnit 测试。有一个陷阱,即 GPathResult 上的 find() 总是返回另一个 GPathResult - 但这可能不包含子项。

对于您的特定用例,我会使用的成语是:

def resp = settingsService.get(path: 'templates')
assert resp.success
assert resp.data.userTemplate.find {it.@id == newUserTemplateId}.isEmpty()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多