当前位置: 首页 > 知识库问答 >
问题:

Wiremock请求匹配-与WireMockRestServiceServer一起使用时,无法将url与动态路径变量匹配

靳彦
2023-03-14

存根映射

{
    "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"
        }
    }
}

无法匹配URL

https://mysite/验证/会话/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();

共有2个答案

陈誉
2023-03-14

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

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合同GitHub页面上提出了这个问题。https://github.com/spring-cloud/spring-cloud-contract/issues/740

甄志
2023-03-14

如WireMock Mailinglist线程所述,该示例应更改为相对URL,如WireMock请求匹配指南所述:

"urlPathPattern": "/validation/session/([a-zA-Z0-9/-]*)"
 类似资料:
  • wiremock如何将URL路径模式与编码的URL精确匹配?是否需要使用已编码的URL保存映射?这是我试了几个小时,却没能成功的方法。 无线映射 我已经尝试过使用编码URL的不同变体,例如/Systems XYZ(ABC)/2016.10/aaa/bbb/api/ccc/customers/*甚至在映射中对(和)进行URL编码,但我的请求似乎不匹配 我试图针对wiremock/Systems XY

  • 我正在使用Spring云合同创建集成测试。从配置到将存根jar添加到项目,一切都正常工作。因此,我发现尽管所有参数和标头都相同,但请求不匹配。 这是API测试 这是API调用的合约 即使我从合同请求中删除用户名,仍然收到相同的错误。 我需要为X-B3-ParentSpanId等创建标题来使其匹配吗?

  • 我正在使用wiremock设置一个虚拟PHP服务器,并希望根据传递的一个XML字段进行匹配。我基本上会有多个请求进入同一个url,但它们之间的主要区别是发票号。wiremock的JSON如下所示 当我使用Postman并只传递带有

  • 我正在尝试使用以下需求比较Soap UI和Wiremck的能力(这对于我的项目中的大多数情况来说是足够现实的)。 目标是为货币价格服务创建一个模拟。要求: > mytesthost/priceservice/getprice 期望一个称为'cur'的参数,它定义当前对,如:cur=EURHUF 当按如下方式调用时,应该使用保存在文件EURHUF中的XML响应进行响应。xml。 mytesthost

  • 两个问题~ 问题1 nginx.conf 怎么写才能让 localhost:8001 下的任意路径都进入到index.html? localhost:8001/ localhost:8001/a localhost:8001/a/b 问题2 以下是 Nginx 下的文件结构 需要访问 localhost:8001/home, 进入到 /example/pages/home.html, 应该怎么配置

  • 这些配置允许你对许多与URL映射和路径匹配有关的设置进行定制。关于所有可用的配置选项,请参考PathMatchConfigurer类的API文档。 下面是采用MVC Java编程配置的一段代码: @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter {