Wiremock 请求模式与请求参数匹配
Wiremock Request Pattern Matching with Request Parameters
我在 Spring Boot 2.1.5 应用程序中使用 spock 和 wiremock 进行功能测试。传入的url是:
/mockedserver/v1/Items('1010873195')/Products?$format=json
是的,这很奇怪 url,但我对此无能为力。
我在 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" 块中模拟了看起来很奇怪的请求参数。这没有用,所以我将正则表达式 .*
放在 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
|
|
-----------------------------------------------------------------------------------------------------------------------
如你所见,它匹配,除了最后的参数部分,基本上,我不关心参数,所以我希望只是通配符。
一种可能是 $
标志把事情弄得一团糟,我应该转义它吗?如果可以,怎么做?
另一个是问号,?
。我试过用 \?
和 \?
来逃避它,但都没有成功。
关于这里看起来很重要的请求块部分:
"method": "GET",
"url": "/mockedserver/v1/Items('1010873195')/Products.*",
"queryParams" : {
"$format": "json"
},
我有 ,如果您使用 urlPath
代替 url
,WireMock 会将额外的 headers 或没有匹配参数的查询参数视为 "don't care, match anyway" .但这里似乎并非如此,因为错误输出显示。
进一步讨论
从那以后,我尝试了各种组合,按照建议使用 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
块,以防万一这有助于匹配,但它似乎没有任何效果。
我开始怀疑我是否需要在 stubFor
调用中设置其他标志?
我认为您需要在映射中尝试使用 "urlPathPattern" 或 "urlPath" 而不是 "url",如下所示:
"urlPathPattern": "/mockedserver/v1/Items('1010873195')/Products.*"
已修复:基本上,您需要 urlPath、不需要 queryParams 和一个 string-based 正则表达式模式,我用以下方法解决了这个问题:
/^\/mockedserver\/v1\/Items\('[0-9]{10}'\)\/Products/
基本上,它归结为正确的组合。
我在 Spring Boot 2.1.5 应用程序中使用 spock 和 wiremock 进行功能测试。传入的url是:
/mockedserver/v1/Items('1010873195')/Products?$format=json
是的,这很奇怪 url,但我对此无能为力。
我在 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" 块中模拟了看起来很奇怪的请求参数。这没有用,所以我将正则表达式 .*
放在 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
|
|
-----------------------------------------------------------------------------------------------------------------------
如你所见,它匹配,除了最后的参数部分,基本上,我不关心参数,所以我希望只是通配符。
一种可能是 $
标志把事情弄得一团糟,我应该转义它吗?如果可以,怎么做?
另一个是问号,?
。我试过用 \?
和 \?
来逃避它,但都没有成功。
关于这里看起来很重要的请求块部分:
"method": "GET",
"url": "/mockedserver/v1/Items('1010873195')/Products.*",
"queryParams" : {
"$format": "json"
},
我有 urlPath
代替 url
,WireMock 会将额外的 headers 或没有匹配参数的查询参数视为 "don't care, match anyway" .但这里似乎并非如此,因为错误输出显示。
进一步讨论
从那以后,我尝试了各种组合,按照建议使用 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
块,以防万一这有助于匹配,但它似乎没有任何效果。
我开始怀疑我是否需要在 stubFor
调用中设置其他标志?
我认为您需要在映射中尝试使用 "urlPathPattern" 或 "urlPath" 而不是 "url",如下所示:
"urlPathPattern": "/mockedserver/v1/Items('1010873195')/Products.*"
已修复:基本上,您需要 urlPath、不需要 queryParams 和一个 string-based 正则表达式模式,我用以下方法解决了这个问题:
/^\/mockedserver\/v1\/Items\('[0-9]{10}'\)\/Products/
基本上,它归结为正确的组合。