我正在 Spring Boot 2.1.5 应用程序中使用 spock 和wiremock 进行功能测试。传入的url是:
/mockedserver/v1/Items('1010873195')/Products?$format=json
是的,这是一个非常奇怪的网址,但我对此无能为力。
我已经在 JSON 中设置了一个路径匹配器:
{
"request": {
"method": "GET",
"url": "/mockedserver/v1/Items('1010873195')/Products.*",
"queryParams" : {
"$format": "json"
},
"headers": {
"x-csrf-token": "",
"Accept": "application/json",
"Content-Type": "application/json"
}
},
"response": {
"headers": {
"Content-Type": "application/json"
},
"status": 200,
"bodyFileName": "/../responses/mockedserver/get-products/1010873195-success-200.json"
}
}
正如您所见,我在“queryParams” block 中对看起来奇怪的请求参数进行了建模。这不起作用,所以我将正则表达式 .*
放在 url 的末尾。
两者都给了我结果:
Request was not matched
=======================
-----------------------------------------------------------------------------------------------------------------------
| Closest stub | Request |
-----------------------------------------------------------------------------------------------------------------------
|
GET | GET
/mockedserver/v1/Items('1010873195')/Produ | /mockedserver/v1/Items('1010873195')/Produ<<<<< URL does not match
cts | cts?$format=json
|
|
-----------------------------------------------------------------------------------------------------------------------
正如你所看到的,它匹配,除了最后的参数部分,基本上,我不关心参数,所以我希望只是通配符它。
一种可能性是 $
符号把事情搞得一团糟,我应该转义它吗?如果是这样,怎么办?
另一个是问号,?
。我尝试使用 \?
和 \\?
转义,但均不成功。
仅涉及请求 block 中看起来很重要的部分:
"method": "GET",
"url": "/mockedserver/v1/Items('1010873195')/Products.*",
"queryParams" : {
"$format": "json"
},
我有seen it said elsewhere如果您使用 urlPath
代替 url
,WireMock 会将没有匹配参数的额外 header 或查询参数视为“不关心,无论如何匹配”。但正如错误输出所示,这里的情况似乎并非如此。
进一步讨论
此后,我尝试了各种组合,按照建议放置 urlPath
、urlPattern
甚至 urlPathPattern
来代替 url
。所有这些都会导致:
Request was not matched
=======================
-----------------------------------------------------------------------------------------------------------------------
| Closest stub | Request |
-----------------------------------------------------------------------------------------------------------------------
|
GET | GET
| /mockedserver/v1/Items('1010873195')/Produ<<<<< URL does not match. URLs must start with a /
| cts?$format=json
|
|
-----------------------------------------------------------------------------------------------------------------------
我还尝试过使用和不使用 queryParams
block ,以防万一这有助于匹配,但它似乎没有任何效果。
我开始想知道是否需要在 stubFor
调用中设置其他一些标志?
最佳答案
已修复:基本上,您需要 urlPath,没有 queryParams,以及基于字符串的正则表达式模式,我用以下方法解决了这个问题:
/^\\/mockedserver\\/v1\\/Items\('[0-9]{10}'\)\\/Products/
基本上,这取决于事物的正确组合。
关于spring-boot - Wiremock 请求模式与请求参数匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56368235/