Citrus中xml序列元素的验证匹配器

问题描述 投票:0回答:1

关于柑橘验证匹配器的正确使用,我有一个问题。在官方XML示例中,为TodoList.xsd定义了以下XSD架构(getTodoListResponse):

<xs:element name="getTodoListResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="list">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="todoEntry" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="id" type="xs:string"/>
                    <xs:element name="title" type="xs:string"/>
                    <xs:element name="description" type="xs:string" minOccurs="0"/>
                    <xs:element name="attachment" minOccurs="0">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="cid" type="xs:string"/>
                          <xs:element name="contentType" type="xs:string"/>
                          <xs:element name="data" type="xs:string"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="done" type="xs:boolean" minOccurs="0"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

定义的验证匹配器看起来像这样(templates/getTodoListResponse.xml):

<todo:getTodoListResponse xmlns:todo="http://citrusframework.org/samples/todolist">
  <todo:list>
    <todo:todoEntry>
      <todo:id>@ignore@</todo:id>
      <todo:title>${todoName}</todo:title>
      <todo:description>${todoDescription}</todo:description>
    </todo:todoEntry>
  </todo:list>
</todo:getTodoListResponse>

但是当通过mvn verify多次运行测试时,生成的XML中有多个todoEntry元素。为了检查结果中返回的XML元素的变量列表。因此检查将失败。

问题是,如果有办法通过XML验证匹配器API表达此动态列表。

我得到了一个基于groovy验证器的工作解决方案,如下所示:assert root.list.children().size() > 1getTodoListResponseValidator.groovy

但我更愿意看到这一点通过XML验证。似乎有类似的名为@matchesXml(),但从文档中我不清楚这是否适合所描述的用例。

Thx提前。

再见马里奥

java xml integration-testing citrus-framework
1个回答
0
投票

底线这对于todo-list演示来说只是一个糟糕的设计测试。集成测试应始终在众所周知的被测应用程序状态下运行。对于其他测试,测试应始终保持干净状态。在该特定样本中违反了这些原则。

实际上,您提到的示例只是一个演示,因此不是作为完全合格的现实世界示例编写的。因此,多次执行时测试不起作用。

要解决此问题,我建议在测试前步骤中清除待办事项列表,以便始终在空列表中操作。另一种可能性是使用XPath验证而不是比较完整的条目列表。 XPath验证可以检查列表条目的数量,例如大于零(就像你在groovy脚本中所做的那样)。

除此之外,您还可以编写一个XPath表达式,该表达式仅验证服务器返回的todos列表中的最后一个条目。这样的事情

<validate path="count(//todo:todoEntry)" value="@greaterThan(0)@" result-type="number"/>
<validate path="//todo:todoEntry[last()]/todo:title" value="${todoName}"></validate>
© www.soinside.com 2019 - 2024. All rights reserved.