如何在WireMock中验证XPath不匹配(不含xmlns属性)
解决WireMock断言XML请求体无xmlns属性的问题
你遇到的equalToXml匹配器通过的原因是它基于XML语义等价性比较,会自动忽略命名空间声明、属性顺序和无关空白,所以即使请求体带xmlns属性也会判定匹配。下面提供两种可行的解决方案:
方法1:使用XPath反向断言
通过matchingXPath结合not()函数,检查根元素不存在xmlns属性:
针对特定根元素(如<customer>)
verify(WireMock.postRequestedFor(urlEqualTo("/otherservice/customers/123")) .withRequestBody(matchingXPath("not(/customer/@xmlns)")));
通用匹配任意根元素
如果不需要限定根元素名称,可使用更通用的表达式:
verify(WireMock.postRequestedFor(urlEqualTo("/otherservice/customers/123")) .withRequestBody(matchingXPath("not(*[@xmlns])")));
方法2:使用精确字符串匹配
如果需要完全匹配XML的字符串内容(包括无xmlns属性),直接用equalTo匹配器代替equalToXml,它会做严格的字符串对比:
String expectedRequestBody = "<customer><name>Jon Doe</name><age>39</age></customer>"; verify(WireMock.postRequestedFor(urlEqualTo("/otherservice/customers/123")) .withRequestBody(equalTo(expectedRequestBody)));
内容的提问来源于stack exchange,提问作者94621
相关产品推荐
相关产品推荐

