如何在 MockRestServiceServer 中通过字符串模式期待 requestTo?

Posted

技术标签:

【中文标题】如何在 MockRestServiceServer 中通过字符串模式期待 requestTo?【英文标题】:How to expect requestTo by String pattern in MockRestServiceServer? 【发布时间】:2019-07-11 18:04:33 【问题描述】:

我有测试:

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。我可以编写自定义匹配器,例如 Spring MockRestServiceServer handling multiple requests to the same URI (auto-discovery)

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

【问题讨论】:

【参考方案1】:

我想“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 等方法)。

org/hamcrest/Matchers 类中还有一个方法 matchesPattern(java.util.regex.Pattern pattern),从 Hamcrest 2 开始就可以使用,它可以用来解决你的问题。

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

所以,你需要:

    检查项目中 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>
    更新您的测试:
mockServer.expect(requestTo(matchesPattern(".*exact-example-url.com.*")))
    .andExpect(method(HttpMethod.GET))
    .andRespond(withSuccess("response", MediaType.APPLICATION_JSON));

【讨论】:

@Justas “预期的空 URL”是什么意思。是某种异常还是什么? 我得到 AssertionError: expected: but got "exact-example-url.com/path" when I do mockServer.expect(requestTo(Mockito.matches(".*example.*"))) 对于那些与上述 Justinas 有相同问题的人,请确保您导入/使用 hamcrest 匹配器而不是 mockito 匹配器。跨度>

以上是关于如何在 MockRestServiceServer 中通过字符串模式期待 requestTo?的主要内容,如果未能解决你的问题,请参考以下文章

MockRestServiceServer:如何用身体模拟 POST 调用?

使用 MockRestServiceServer 时无法精确测试服务调用次数

Spring MockRestServiceServer 处理多个异步请求

由于未绑定的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer

如何管理在开发(而非测试)环境中使用多个微服务并对其进行模拟?

Spring Boot + 云 | Zuul 代理 |集成测试