Проверка цитрусовых XPath не может найти элемент - PullRequest
0 голосов
/ 11 июня 2018

У меня есть полезная нагрузка XML с элементом ValidationFault.Часть моей проверки состоит в том, чтобы подтвердить, что элемент ValidationFault встречается только один раз в полезной нагрузке XML.Используя следующий Citrus Java DSL:

runner.receive(action -> action.endpoint(endpointName)
      .validate("number://ValidationFault", 1));

Я не получаю ожидаемое значение 1 вместо 0:

com.consol.citrus.exceptions.TestCaseFailedException: Validation failed: Values not equal for element '//ValidationFault', expected '1' but was '0'

Я вручную подтвердил, что полезная нагрузка ответа содержитэлемент в вопросе.Я также проверил XPath с помощью внешнего инструмента и обнаружил, что XPath должен быть правильным.Я также пытался использовать пространства имен //soapenv:ValidationFault и //:ValidationFault, но получаю то же исключение.

Редактировать:

Это полученная полезная нагрузка XML (с некоторыми даннымиудалено):

<?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
             xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
     <env:Header/>
     <SOAP-ENV:Body
              xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <soapenv:Fault>
         <faultcode>soapenv:Client</faultcode>
         <faultstring>ValidationFault</faultstring>
         <faultactor>GetSalutation</faultactor>
         <detail>
             <ValidationFault
                 fault:retryable="false"
                 xmlns="http://domain/fault/2.0/"
                 xmlns:fault="domain/fault/2.0/">
             <ErrorCode>flt-00001</ErrorCode>
             <DescriptionText>A Schema Validation Failed</DescriptionText>
              <Details>
                  <Text></Text>
              </Details
              <TransactionControlIdentificationID>
                  TBD
              </TransactionControlIdentificationID>
              <ZuluDateTime><ZuluDateTime>
          </ValidationFault>
      </detail>
  </soapenv:Fault>
  </SOAP-ENV:Body>
</soapenv:Envelope>

1 Ответ

0 голосов
/ 12 июня 2018

Вам необходимо использовать контекст пространства имен, который объявляет префиксы пространства имен для оценки выражения Xpath:

receive(action -> action.endpoint(fooChannel)
        .namespace("ns", "http://domain/fault/2.0/")
        .validate("number:count(//ns:ValidationFault)", 1));

По умолчанию выражение Xpath соответствует значениям узла.Поэтому, пожалуйста, убедитесь, что вы используете функцию count(), чтобы оценить количество элементов.

В качестве альтернативы этому вы можете оценить набор узлов и использовать совпадение Hamcrest hasSize():

receive(action -> action.endpoint(fooChannel)
        .namespace("ns", "http://domain/fault/2.0/")
        .validate("node-set://ns:ValidationFault", Matchers.hasSize(1)));
...