如何在MockRestServiceServer中按字符串模式期望requestTo?

时间:2019-02-18 11:06:22

标签: java spring-boot junit mockito mockserver

我有以下测试:

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

当我使用any(String.class)或确切的网址运行时,它们会很好地工作:

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 个答案:

答案 0 :(得分:2)

我想“ any”实际上是Mockito.any()方法吗?在这种情况下,您可以使用Mockito.matches(“ regex”)。查看文档:{​​{3}}


编辑:事实证明,MockRestServiceServer使用Hamcrest匹配器来验证期望值(诸如requestTo,withSuccess之类的方法)。

https://static.javadoc.io/org.mockito/mockito-core/1.9.5/org/mockito/Matchers.html#matches(java.lang.String) 类中还有一种方法 matchesPattern(java.util.regex.Pattern pattern) ,自Hamcrest 2开始可用,可以用来解决您的问题

但是在您的项目中,您可能依赖于旧版本的Hamcrest(1.3),例如,junit 4.12,最新的spring-boot-starter-test-2.13或最终使用的org。模拟服务器.mockserver-netty.3.10.8(可传递)。

因此,您需要:

  1. 检查项目中Hamcrest的实际版本,并(如果不是2+)手动更新此依赖项:org/hamcrest/Matchers
<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));