Поиск элемента XML из RESTClient с помощью XMLSlurper - PullRequest
1 голос
/ 09 декабря 2010

Я пишу тест Спока, в котором у меня есть веб-сервис REST, который возвращает 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>

Мой тест хочет убедиться, что конкретный шаблон пользователя в этом документе не . Итак, используя REST-клиент HTTP Builder и 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 (потому что нет шаблона с таким идентификатором; выражение будет печатать его. * false , в этом случае значение newUserTemplateId равно 1171).
Однако delTemplate относится к типу groovy.util.slurpersupport.NoChildren и, по-видимому, содержит элемент userTemplate.

Забавно, если я напишу быстрый скрипт с тем же XML-кодом, что и текст (в отличие от чтения его из REST), res.userTemplate.find { it.@id == 1171 } вернет ноль, как и ожидалось.

Что я делаю не так или как я могу это решить?

1 Ответ

2 голосов
/ 01 августа 2011

Я использую httpBuilder с XMLSlurper для тестирования остальных веб-сервисов JUnit. Есть недочёт, что find () в GPathResult всегда возвращает другой GPathResult - но это может не содержать дочерних элементов.

Для вашего конкретного случая использования я бы использовал следующую фразу:

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