Как установить порт MockWebServer на WebClient в тесте JUnit? ⇐ JAVA
-
Anonymous
Как установить порт MockWebServer на WebClient в тесте JUnit?
Я использую spring-boot с WebClient, который автоматически подключается как bean-компонент.
Проблема: при написании интеграционного теста junit мне приходится использовать okhttp MockWebServer. Этот макет всегда запускается на случайном порту, например, localhost:14321.
Теперь мой WebClient, конечно, имеет фиксированный URL-адрес, на который он отправляет запросы. Этот URL-адрес может быть задан параметром application.properties, например webclient.url=https://my.domain.com/, чтобы я мог переопределить это поле в webclient.url=https://my.domain.com/. код>junit тест. Но только статически.
Вопрос: как я могу сбросить bean-компонент WebClient внутри @SpringBootTest, чтобы он всегда отправлял запросы на мой макетный сервер?
@Service общественный класс WebClientService { public WebClientService(WebClient.Builder builder, @Value("${webclient.url}" String url) { this.webClient = builder.baseUrl(url)...build(); } публичный ответ send() { вернуть webClient.body().exchange().bodyToMono(); } } @Услуга общественный недействительный CallingService { @Autowired частный сервис WebClientService; публичный недействительный вызов() { сервис.отправить(); } } @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) общественный класс MyWebTest { @Autowired частный вызов CallingService; @Тест публичный недействительный тест() { MockWebServerockWebServer = новый MockWebServer(); System.out.println("Текущий URL-адрес фиктивного сервера: " +ockWebServer.url("/").toString()); //это случайно ockWebServer.enqueue(новый MockResponse()....); //TODO, как сделать URL-адрес имитируемого сервера общедоступным для веб-клиента? вызов.вызов(); } } Как видите, я пишу полноценный интеграционный тест junit в реальном мире. Единственная проблема: как я могу передать URL-адрес и порт MockWebServer WebClient, чтобы он автоматически отправлял запросы на мой макет??
Примечание: мне определенно нужен случайный порт в MockWebServer, чтобы не мешать другим запущенным тестам или приложениям. Таким образом, придется придерживаться случайного порта и найти способ передать его веб-клиенту (или динамически переопределить свойство приложения).
Обновление: Я придумал следующее, и это работает. Но, может быть, кто-нибудь знает, как сделать поле макетного сервера нестатическим?
@ContextConfiguration(инициализаторы = RandomPortInitializer.class) публичный абстрактный класс AbstractITest { @ClassRule общедоступный статический окончательный MockWebServerockWebServer = новый MockWebServer(); публичный статический класс RandomPortInitializer реализует ApplicationContextInitializer { @Override public void инициализировать (ConfigurableApplicationContext applicationContext) { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext, "webclient.url=" +ockWebServer.url("/").toString()); } } }
Я использую spring-boot с WebClient, который автоматически подключается как bean-компонент.
Проблема: при написании интеграционного теста junit мне приходится использовать okhttp MockWebServer. Этот макет всегда запускается на случайном порту, например, localhost:14321.
Теперь мой WebClient, конечно, имеет фиксированный URL-адрес, на который он отправляет запросы. Этот URL-адрес может быть задан параметром application.properties, например webclient.url=https://my.domain.com/, чтобы я мог переопределить это поле в webclient.url=https://my.domain.com/. код>junit тест. Но только статически.
Вопрос: как я могу сбросить bean-компонент WebClient внутри @SpringBootTest, чтобы он всегда отправлял запросы на мой макетный сервер?
@Service общественный класс WebClientService { public WebClientService(WebClient.Builder builder, @Value("${webclient.url}" String url) { this.webClient = builder.baseUrl(url)...build(); } публичный ответ send() { вернуть webClient.body().exchange().bodyToMono(); } } @Услуга общественный недействительный CallingService { @Autowired частный сервис WebClientService; публичный недействительный вызов() { сервис.отправить(); } } @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) общественный класс MyWebTest { @Autowired частный вызов CallingService; @Тест публичный недействительный тест() { MockWebServerockWebServer = новый MockWebServer(); System.out.println("Текущий URL-адрес фиктивного сервера: " +ockWebServer.url("/").toString()); //это случайно ockWebServer.enqueue(новый MockResponse()....); //TODO, как сделать URL-адрес имитируемого сервера общедоступным для веб-клиента? вызов.вызов(); } } Как видите, я пишу полноценный интеграционный тест junit в реальном мире. Единственная проблема: как я могу передать URL-адрес и порт MockWebServer WebClient, чтобы он автоматически отправлял запросы на мой макет??
Примечание: мне определенно нужен случайный порт в MockWebServer, чтобы не мешать другим запущенным тестам или приложениям. Таким образом, придется придерживаться случайного порта и найти способ передать его веб-клиенту (или динамически переопределить свойство приложения).
Обновление: Я придумал следующее, и это работает. Но, может быть, кто-нибудь знает, как сделать поле макетного сервера нестатическим?
@ContextConfiguration(инициализаторы = RandomPortInitializer.class) публичный абстрактный класс AbstractITest { @ClassRule общедоступный статический окончательный MockWebServerockWebServer = новый MockWebServer(); публичный статический класс RandomPortInitializer реализует ApplicationContextInitializer { @Override public void инициализировать (ConfigurableApplicationContext applicationContext) { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext, "webclient.url=" +ockWebServer.url("/").toString()); } } }
Мобильная версия