Как установить порт MockWebServer на WebClient в тесте JUnit?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как установить порт MockWebServer на WebClient в тесте JUnit?

Сообщение Anonymous »


Я использую 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()); } } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»