【问题标题】:Wiremock request matching - Cannot match url with dynamic path variable when used with WireMockRestServiceServerWiremock 请求匹配 - 与 WireMockRestServiceServer 一起使用时,无法将 url 与动态路径变量匹配
【发布时间】:2018-09-21 16:30:21
【问题描述】:

存根映射

{
    "request": {
        "method": "GET",
        "urlPathPattern": "/validation/session/([a-zA-Z0-9/-]*)"
    },
    "response": {
        "status": 200,
        "jsonBody": {
            "isIpBlocked": "Y",
            "serviceMessage": {
                "type": "OK",
                "code": "200",
                "description": "IP validated successfully. No result found"
            }
        },
        "headers": {
            "Content-Type": "application/json"
        }
    }
}

无法匹配网址

https://mywebsite/validation/session/687d69ae-42a8-4584-a395-8e0c876bacae (绝对路径和相对路径都不行)

还尝试用 urlPattern 替换 urlPathPattern,但没有成功

尝试了以下所有组合。没有任何效果

/validation/session/([a-zA-Z0-9\\-]+)
/validation/session/([a-zA-Z0-9\\-]*)
/validation/session/([a-zA-Z0-9/-]+)
/validation/session/([a-zA-Z0-9/-]*)

注意: Wiremock 版本 2.18.0,Spring Boot 2.0

实际上,除了 url(在带有绝对 URL 的存根映射中)之外,没有什么对我有用。

如果我单独使用 Wiremock,它会完美运行。如果我将 Wiremock 与 WireMockRestServiceServer (spring-cloud-contract) 结合使用,它将不起作用。

工作代码 - 单独使用 Wiremock

@Rule
  public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8080).httpsPort(443));

stubFor(get(urlMatching("/validation/session/([a-zA-Z0-9/-]*)"))        .willReturn(aResponse().withStatus(HttpStatus.OK.value()).withHeader("Content-Type", "application/json")
              .withBody("{\"isIpBlocked\": \"Y\"}")));

不工作 - 使用 WireMockRestServiceServer 编写代码

MockRestServiceServer server = WireMockRestServiceServer.with(this.restTemplate)
      .stubs("classpath:/stubs/**/validate-ip-success-mock-response.json").build();

【问题讨论】:

  • 您的urlPathPattern 是绝对网址,您尝试过相对路径吗?
  • 另外,请举例说明正在为您工作。如果没有任何效果,那么我们可能需要更多信息来帮助您,因为问题可能在您的配置中的其他地方。
  • 您可能想要编辑您的第一个存根映射 sn-p。您的 urlPathPattern 正则表达式缺少右括号 ([a-zA-Z0-9/-]*
  • 只是复制粘贴错误。我只是添加了括号。这更像是一个 WireMockRestServiceServer 问题。它与 Wiremock 无关。

标签: regex spring-boot junit testcase wiremock


【解决方案1】:

正如 WireMock 邮件列表 thread 中所讨论的,该示例应更改为 WireMock Guide on Request Matching 中所述的相对 URL:

"urlPathPattern": "/validation/session/([a-zA-Z0-9/-]*)"

【讨论】:

  • 我已经尝试过使用绝对 URL 和相对 URL。它没有用。另外,更新了我的问题。
【解决方案2】:

我找到了一个临时解决方案。我已经为动态路径变量编写了自己的模式匹配器。

MockRestServiceServer server = WireMockRestServiceServer.with(this.restTemplate)
          .stubs("classpath:/stubs/valic-get-user-details-mock-response.json").build();  //no dynamic url

  Resource validateIpResponse = new ClassPathResource("/stubs/validate-ip-success-mock-response.json");
  Pattern pattern = Pattern.compile("https://helloworld.com/validation/session/([a-zA-Z0-9/-]*)");
  Matcher<String> matcher = MatchesPattern.matchesPattern(pattern);
  server.expect(MockRestRequestMatchers.requestTo(matcher))
      .andRespond(MockRestResponseCreators.withSuccess(validateIpResponse, MediaType.APPLICATION_JSON));

我在 Spring Cloud Contract GitHub 页面上提出了这个问题。 https://github.com/spring-cloud/spring-cloud-contract/issues/740

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多