计算在Wiremock中返回布尔值的表达式-请求匹配条件

时间:2018-10-25 21:33:29

标签: xml xpath soap wiremock service-virtualization

尝试将Wiremock用作虚拟化SOAP服务的工具。

请求映射条件如下所示:-

映射标准:

   {
      "request":{
        "method":"POST",
        "urlPattern":"/myServices/mycontent.asgx",
        "headers":{
          "SOAPAction":{
            "contains":"#SearchMyContent"
          }
        },
        "bodyPatterns":[{
          **"matchesXPath":"//data:MyContentItemCode[contains(text(), 'SD_12345')] and //MyContentItemCode[contains(text(), 'SD_22222')]",**
          "xPathNamespaces":{
            "SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
            "data":"http://www.ins.com/insi/1.0/insi-data",
            "msg":"http://www.ins.com/insi/1.0/insi-messaging",
            "nc":"http://www.ins.com/insi/1.0/insi-non-compliant",
            "soapenv":"http://schemas.xmlsoap.org/soap/envelope/",
            "srvc":"http://www.ins.com/insi/1.0/insi-services"
        }
        }]
      },
      "response":{
        "status":200,
        "headers":{
          "Content-Type":"text/xml;charset=utf-8"
        },
        "body":"encoded_XML_body"
      }
    } 

出于安全原因,我无法在此处发布整个SOAP服务请求,但下面是SOAP服务的一小段代码,必须与映射条件中的xpath匹配

<srvc:MyContentItemCodeList>
    <data:MyContentItemCode>SD_12345</data:MyContentItemCode>
    <data:MyContentItemCode>SD_22222</data:MyContentItemCode>
</srvc:MyContentItemCodeList>

如您所见,我正在尝试匹配映射条件中的两个“ data:MyContentItemCode ”标签。但是,wiremock无法识别/支持此功能。可能是因为xpath返回了布尔值。我的问题是-在Wiremock中是否可以匹配布尔值。

我在Wiremock文档中找不到以下示例:-http://wiremock.org/docs/request-matching/

当我将映射发布到Wiremock服务器时,它确实被成功发布了,但是当我尝试点击Wiremock服务器时,我没有得到我的虚拟响应(即不考虑请求匹配)

对此有任何帮助/指点。

1 个答案:

答案 0 :(得分:2)

您面临的问题是您需要将元素/标签返回给匹配器。这可以通过使用根标签来完成。在此示例中,我使用了您的示例暗示存在的肥皂信封标签。

仅返回根元素的机制是通过计算符合条件的元素数量。如果两者都为真,则还返回根元素。下面的示例就是这样做的。

mapping.json

   {
      "request":{
        "method":"POST",
        "urlPattern":"/dtag",
        "bodyPatterns":[{
          "matchesXPath":"/SOAP-ENV:Envelope[count(//data:MyContentItemCode[contains(text(), 'SD_12345')])=1 and count(//data:MyContentItemCode[contains(text(), 'SD_22222')] )=1]",
          "xPathNamespaces":{
            "SOAP-ENV": "http://schemas.xmlsoap.org/soap/envelope/",
            "data":"http://www.ins.com/insi/1.0/insi-data",
            "srvc":"http://www.ins.com/insi/1.0/insi-services"
        }       

        }]
      },
      "response":{
        "status":200,
        "headers":{
          "Content-Type":"text/xml;charset=utf-8"
        },
        "body":"encoded_XML_body"
      }
    } 

下面的XML通过POST请求发送到下面的URL。由于WireMock对名称空间非常挑剔,因此请确保您具有正确的名称空间,这些名称空间与标签在请求中的显示方式相同。

请求http://localhost/dtag

<?xml version="1.0"?>

<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:data="http://www.ins.com/insi/1.0/insi-data"
xmlns:srvc="http://www.ins.com/insi/1.0/insi-services">
    <srvc:MyContentItemCodeList >
    <data:MyContentItemCode>SD_12345</data:MyContentItemCode>
    <data:MyContentItemCode>SD_22222</data:MyContentItemCode>
    </srvc:MyContentItemCodeList>
</soap:Envelope>