我正在尝试设置一个Wiremock存根,如果JSON有效负载中的任何字段的值为空,则它将返回400错误。基本上是模拟错误请求。我一直在尝试使用匹配json键的任何小写字符串的正则表达式,但似乎不喜欢它。我在网上找不到我想要的任何示例,因此不确定是否有可能。
我的不良要求正文:
{
"cat": null,
"dog": {
"id": 1344
},
"horse": {
"id": 1
},
"fish": 1
}
我的存根:
wireMockServer.stubFor(post(urlEqualTo("/sample-api"))
.withRequestBody(matchingJsonPath("$.^[a-z]*", equalTo(null)))
.willReturn(aResponse()
.withStatus(400)
.withHeader("Content-Type", "application/json")))
在此示例中,我希望存根匹配“ cat”,因为它的值为null。事实并非如此。谁能告诉我我在做什么错?
在WireMock有关请求匹配的文档中,有关JSON路径匹配的部分。在源代码中,有对所用com.jayway.jsonpath.JsonPath
库的引用。该的build.gradle指的是2.4.0版本。Jayway JSON路径库的文档可以在其Github项目页面上找到。这是一个很好的,但绝不是完美的在线评估在这里。
WireMock文档仅以“ matchesJsonPath ” 的形式显示对节点值的正则表达式的支持。Jayway文档中有一个在线示例:$ .. book [?(@。author =〜/.*REES/i)]。因此,唯一的方法是命名所有不允许的节点null
。
在下面的示例映射中,无论深度如何,所有提到的节点都将进行测试(请参阅@id)。如果所有提及的节点都不为空,则该映射将不会触发,但是某些未提及的节点为null。
{
"request": {
"urlPattern": "/sample-api",
"method": "GET",
"bodyPatterns" : [ {
"matchesJsonPath" : "$..[?(@.cat == null || @.dog == null || @.horse == null || @.fish == null || @.id == null)]"
} ]
},
"response": {
"status": "400",
"headers": {
"Content-Type": "application/json; charset=utf-8"
},
"jsonBody": {
"message": "some sapi message"
}
}
}
“在Jayway文档中,没有提供用于灵活的节点名方法的方法。因此,唯一的方法是命名所有不允许为空的节点。” -因此,鉴于此声明,在这种情况下无法将json键与正则表达式匹配?
更新了答案,并确认RegEx只能匹配值。