Spring MockRestServiceServer, обрабатывающий несколько асинхронных запросов
У меня есть служба весенней загрузки orchestrator, которая отправляет несколько асинхронных запросов на отдых внешним службам, и я хотел бы посмеяться над ответами этих служб.
Мой код:
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 ответ
Я столкнулся с той же проблемой и обнаружил, что это было вызвано двумя причинами
- 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())
Я нашел решение через комбинацию этих двух других ответов, которые могли бы предложить больше информации.
Как использовать MockRestServiceServer с несколькими URL-адресами?