澄清
我对您当前的解决方案有两点意见:
extractFromPayload(..)
body
将JSON 的一部分提取到一个名为的 Citrus 变量body
中。这与零件没有任何关系payload(..)
。您刚刚将 JSON 内容存储body
到 Citrus 变量body
中。您可能知道也可能不知道这一点
该payload(..)
方法将始终验证接收到的整个有效负载,即整个 JSON 对象。
如果您只想验证响应的一部分,请使用JSON 路径验证: .validate("$.some.json.path", "someValue")
解决方案
Citrus 为您的用例提供了一个内部方法,请参阅matchesXml()的文档。
仅验证 XML 结构
这是最简单的解决方案:
http()
.client(wiremockClient)
.receive()
.response(HttpStatus.OK)
.messageType(MessageType.JSON)
.validate("$.requests[0].request.body", @matchesXml('citrus:readFile('classpath:output/esb/add_conf_to_cart/response2.xml')')@)
验证整个 JSON 响应
在您的情况下,您只需匹配整个 JSON 结构并将方法@matchesXml('<some><validation_xml></some></validation_xml>')@
放入正确的 JSON 条目中:
http()
.client(wiremockClient)
.receive()
.response(HttpStatus.OK)
.messageType(MessageType.JSON)
.payload("{\n"+
" \"requests\": {\n"+
" \"id\": \"52844d5a-59de-4288-8000-7f48fcda41e5\",\n"+
" \"request\": {\n"+
" \"body\": \"@matchesXml('<soapenv:Envelope xmlns:soapenv=\\\"http://schemas.xmlsoap.org/soap/envelope/\\\"> [content omitted] </soapenv:Body></soapenv:Envelope>')@\"\n"+
" }\n"+
" }\n"+
"}");
评论
- 放入的字符串
payload
必须是有效的 JSON,即 JSON 值中的引号必须被转义。
- Java字符串中的引号也必须被转义,因此我们必须写
\\\"
- Citrus 首先将字符串解析
payload
为 JSON,并在内部将其保留为 JSON 对象,其中转义引号未转义。然后它将这个字符串传递给验证函数matchesXml
。
- 您当前的示例不是有效的 XML,因为标签
</soapenv:Body>
从未打开
- 将有效负载请求放入单独的文件中要容易得多,只需注意文件仍然必须是有效的 JSON,即用一个反斜杠转义的引号,如下所示
\"
- 您可能希望从单独的文件中读取 XML 内容。在这种情况下,您可以使用 Citrus 的
citrus:readFile()
功能
- 对于
payload
,您仍然需要在 XML 中转义引号。你可以这样做citrus:translate()
:citrus:translate('citrus:readFile('classpath:some/path/to/response.xml')', '\"', '\\"')
- 转义非常棘手,因为我们正在处理 Java、JSON 和 XML 中特殊的引号和反斜杠
- 它应该按如下方式工作:
创建一个文件response_validation.json
:
{
"requests": {
"id": "52844d5a-59de-4288-8000-7f48fcda41e5",
"request": {
"body": "@matchesXml('${jsonEscapedXmlInput}')@"
}
}
}
在您的测试用例中,创建jsonEscapedXmlInput
读取和转义 XML 文件的 Citrus 变量:
variable("jsonEscapedXml", "citrus:translate('citrus:readFile('classpath:output/esb/add_conf_to_cart/response2.xml')', '\\\"', '\\\\\"')")
然后使用它
http()
.client(wiremockClient)
.receive()
.response(HttpStatus.OK)
.messageType(MessageType.JSON)
.payload(new ClassPathResource("classpath:validation/response_validation.json"))
;