Spring MockRestServiceServer处理多个异步请求

时间:2017-12-13 12:45:36

标签: spring-boot junit mockserver

我有一个orchestrator 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:预期的请求URI:http://localhost/retrieveBook/book1但是:http://localhost/retrieveFilm/film1

任何想法我怎么能解决这个问题,有什么类似于mockito说这个url被执行然后返回这个或那个?

由于 此致

1 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,发现它是由两件事造成的

  1. 默认的MockRestServiceServer按您定义的顺序要求请求。您可以通过创建MockRestServiceServer来解决这个问题:
  2. MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()

    1. (可能)为了两次使用相同的URI,请使用mockServer.expect(ExpectedCount.manyTimes(),RequestMatcher)方法来构建响应。
    2. 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)