如何在 MockRestServiceServer 中通过 String 模式期望 requestTo?

How to expect requestTo by String pattern in MockRestServiceServer?

我有测试:

org.springframework.test.web.client.MockRestServiceServer mockServer

当我 运行 与 any(String.class) 或确切 URL 时,它们运行良好:

mockServer.expect(requestTo(any(String.class)))
.andExpect(method(HttpMethod.GET))
.andRespond(withSuccess("response", MediaType.APPLICATION_JSON));

或:

mockServer.expect(requestTo("https://exact-example-url.com/path"))
.andExpect(method(HttpMethod.GET))
.andRespond(withSuccess("response", MediaType.APPLICATION_JSON));

我希望通过字符串模式进行请求以避免检查精确 URL。我可以像

那样编写自定义匹配器

还有其他方法可以通过字符串模式制作mockServer.expect(requestTo(".*example.*"))吗?

我想 "any" 实际上是一个 Mockito.any() 方法?在那种情况下,您可以使用 Mockito.matches("regex")。请参阅文档:https://static.javadoc.io/org.mockito/mockito-core/1.9.5/org/mockito/Matchers.html#matches(java.lang.String)


编辑: 事实证明,MockRestServiceServer 使用 Hamcrest 匹配器来验证预期(如 requestTo、withSuccess 等方法)。

还有一个方法matchesPattern(java.util.regex.Pattern pattern) in org/hamcrest/Matchersclass从Hamcrest 2开始就有了,可以用来解决你的问题

但是在您的项目中,您可能依赖于旧版本的 Hamcrest (1.3),例如 junit 4.12,最新的 spring-boot-starter-test-2.13,或者,最后,org.mock-server.mockserver-netty.3.10.8(传递)。

因此,您需要:

  1. 检查项目中 Hamcrest 的实际版本并(如果不是 2+)手动更新此依赖项:https://mvnrepository.com/artifact/org.hamcrest/hamcrest/2.1
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.1</version>
    <scope>test</scope>
</dependency>
  1. 更新您的测试:
mockServer.expect(requestTo(matchesPattern(".*exact-example-url.com.*")))
    .andExpect(method(HttpMethod.GET))
    .andRespond(withSuccess("response", MediaType.APPLICATION_JSON));