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 ответ

Я столкнулся с той же проблемой и обнаружил, что это было вызвано двумя причинами

  1. MockRestServiceServer по умолчанию ожидает запросы в порядке их определения. Вы можете обойти это, создав свой MockRestServiceServer следующим образом:

MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build()

  1. (Возможно) Чтобы дважды использовать один и тот же URI, используйте метод mockServer.expect(ExpectedCount.manyTimes(), RequestMatcher) для построения вашего ответа.

mockServer.expect(ExpectedCount.manyTimes(), MockRestRequestMatchers.requestTo(myUrl)) .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) .andRespond(createResponse())

Я нашел решение через комбинацию этих двух других ответов, которые могли бы предложить больше информации.

Как использовать MockRestServiceServer с несколькими URL-адресами?

Spring MockRestServiceServer, обрабатывающий несколько запросов к одному и тому же URI (автообнаружение)

Другие вопросы по тегам