Как ожидать requestTo по шаблону String в MockRestServiceServer?

У меня есть тесты с:

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

Когда я бегу с any(String.class) или точный URL они работают хорошо:

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));

Я хочу ожидать запрос по шаблону String, чтобы избежать проверки точного URL. Я могу написать собственный сопоставитель, как в Spring MockRestServiceServer, обрабатывающий несколько запросов к одному и тому же URI (автообнаружение)

Есть ли другой способ сделать mockServer.expect(requestTo(".*example.*")) по строковому образцу?

1 ответ

Решение

Я полагаю, что "любой" на самом деле метод Mockito.any()? В этом случае вы можете использовать Mockito.matches("regex"). См. Документы: https://static.javadoc.io/org.mockito/mockito-core/1.9.5/org/mockito/Matchers.html.


РЕДАКТИРОВАТЬ: Оказывается, что MockRestServiceServer использует сопоставления Hamcrest для проверки ожиданий (методы, такие как requestTo, withSuccess и т. Д.).

Существует также метод matchPattern(шаблон java.util.regex.Pattern) в классе org / hamcrest / Matchers, который доступен начиная с Hamcrest 2, и его можно использовать для решения вашей проблемы.

Но в вашем проекте вы, вероятно, зависите от более старой версии Hamcrest (1.3), которая используется, например, junit 4.12, последним spring-boot-starter-test-2.13 или, наконец, org.mock-server.mockserver-netty.3.10.8 (транзитивно).

Итак, вам необходимо:

  1. Проверьте актуальную версию Hamcrest в своем проекте и (если это не 2+) обновите эту зависимость вручную: https://mvnrepository.com/artifact/org.hamcrest/hamcrest/2.1
<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));
Другие вопросы по тегам