XML 与 Wiremock 匹配

XML Matching with Wiremock

我正在使用 wiremock 设置虚拟 PHP 服务器,并希望根据传递的 XML 字段之一进行匹配。我基本上会有多个请求进入同一个 url,但它们之间的主要区别在于发票编号。我的 JSON 线模看起来像这样

{
  "request": {
    "method": "ANY",
    "urlPattern": ".*/test.php",
    "bodyPatterns" : [{
      "equalToXml": "<InvoiceNumber>6</InvoiceNumber>"
    }]
  },
  "response": {
    "status": 200,
    "bodyFileName": "sample.xml",
    "headers": {
      "Content-Type": "application/xml"
    }
  }
}

当我使用 Postman 并且只通过 <InvoiceNumber></InvoiceNumber> 字段传递 XML 时,这工作正常,但是当我添加辅助字段时它失败了。

我希望能够将任何 Xml 传递给 wiremock,只要它具有 <InvoiceNumber></InvoiceNumber> 字段,它就会读取它。

使用正则表达式方法找到解决方案并使用 matches 而不是 equalToXml

{
  "request": {
    "method": "ANY",
    "urlPattern": ".*/test.php",
    "bodyPatterns" : [{
      "matches": ".*<InvoiceNumber>6</InvoiceNumber>.*"
    }]
  },
  "response": {
    "status": 200,
    "bodyFileName": "sample.xml",
    "headers": {
      "Content-Type": "application/xml"
    }
  }
}

您可能希望改用 XPath 匹配,如 WireMock documentation 中所述。 WireMock 有一些不错的 XML 功能,包括占位符,值得保留。

XPath

如果属性值有效 XML 并且与提供的 XPath 表达式相匹配,则视为匹配。如果 XPath 评估返回任何元素,则 XML 文档将被视为匹配。 WireMock 委托给 Java 的内置 XPath 引擎(通过 XMLUnit),因此直到(至少)Java 8 它支持 XPath 版本 1.0。

Java:

.withRequestBody(matchingXPath("//InvoiceNumber[text()='6']"))

JSON:

{   "request": {
    ...
     "bodyPatterns" : [ {
      "matchesXPath" : "//InvoiceNumber[text()='6']"
    } ]
    ...   },   ... }