spring-boot - Wiremock 请求模式与请求参数匹配

标签 spring-boot groovy spock wiremock

我正在 Spring Boot 2.1.5 应用程序中使用 spock 和wiremock 进行功能测试。传入的url是:

/mockedserver/v1/Items('1010873195')/Products?$format=json

是的,这是一个非常奇怪的网址,但我对此无能为力。

我已经在 J​​SON 中设置了一个路径匹配器:

{
  "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 或查询参数视为“不关心,无论如何匹配”。但正如错误输出所示,这里的情况似乎并非如此。

进一步讨论 此后,我尝试了各种组合,按照建议放置 urlPathurlPattern 甚至 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/

相关文章:

java - 如何在beanfactory中注册bean?

spring-boot - JVM 在验证 pub/sub 时崩溃

groovy - 从 Spring Boot 渲染 GORM 类

groovy - Spock UnitTest,调用太少,但 "Unmatched invocations"列表中的调用完全相同

unit-testing - Class.metaclass.static说不能在null上获得静态

testing - Spock 可以监视真实对象吗?

java - 使用Spring Jaxb2Marshaller生成动态命名空间前缀

java - Spring Boot 中的 ACL 安全性

mysql - 来自 jenkins scriptler 的 groovy 脚本无法正常工作。类路径问题

java - 帮助解决失败的 Grails 测试 - 域方法不起作用?