如何在 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