Spring MockRestServiceServer 处理多个异步请求
Posted
技术标签:
【中文标题】Spring MockRestServiceServer 处理多个异步请求【英文标题】:Spring MockRestServiceServer handling multiple Async requests 【发布时间】:2018-05-27 08:44:31 【问题描述】:我有一个编排器 Spring Boot 服务,它向外部服务发出多个异步休息请求,我想模拟这些服务的响应。
我的代码是:
mockServer.expect(requestTo("http://localhost/retrieveBook/book1"))
.andExpect(method(HttpMethod.GET))
.andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK)
.body("\"book\":\"title\":\"xxx\",\"year\":\"2000\"")
.contentType(MediaType.APPLICATION_JSON));
mockServer.expect(requestTo("http://localhost/retrieveFilm/film1"))
.andExpect(method(HttpMethod.GET))
.andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK)
.body("\"film\":\"title\":\"yyy\",\"year\":\"1900\"")
.contentType(MediaType.APPLICATION_JSON));
service.retrieveBookAndFilm(book1,film1);
mockServer.verify();
retrieveBookAndFilm 服务异步调用两个方法,一个是检索书,另一个是检索电影,问题是有时首先执行电影服务,我得到一个错误:
java.util.concurrent.ExecutionException: java.lang.AssertionError: Request URI expected:http://localhost/retrieveBook/book1 but was:http://localhost/retrieveFilm/film1
知道如何解决这个问题,有没有类似于 mockito 的东西来说明这个 url 何时执行然后返回这个或那个?
谢谢 问候
【问题讨论】:
【参考方案1】:我遇到了同样的问题,发现它是由两件事引起的
-
默认的 MockRestServiceServer 会按照您定义的顺序接收请求。你可以像这样创建你的 MockRestServiceServer 来解决这个问题:
MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()
-
(可能)为了两次使用相同的 URI,请使用 mockServer.expect(ExpectedCount.manyTimes(), RequestMatcher) 方法来构建您的响应。
mockServer.expect(ExpectedCount.manyTimes(),
MockRestRequestMatchers.requestTo(myUrl))
.andExpect(MockRestRequestMatchers.method(HttpMethod.GET))
.andRespond(createResponse())
我通过组合这两个可能提供更多信息的其他答案找到了解决方案。
How to use MockRestServiceServer with multiple URLs?
Spring MockRestServiceServer handling multiple requests to the same URI (auto-discovery)
【讨论】:
非常感谢MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()
的这个提示 - 它帮助很大!以上是关于Spring MockRestServiceServer 处理多个异步请求的主要内容,如果未能解决你的问题,请参考以下文章
Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC
学习笔记——Spring简介;Spring搭建步骤;Spring的特性;Spring中getBean三种方式;Spring中的标签
Spring框架--Spring事务管理和Spring事务传播行为