Я использую Spring-Boot с WebClient, который автоматически подключается как bean-компонент.
Проблема: при написании junit< /code> интеграционный тест, мне нужно использовать okhttp MockWebServer. Этот макет всегда запускается на случайном порту, например, localhost:14321.
Теперь мой веб-клиент, конечно, имеет фиксированный URL-адрес, который он отправляет. запросы к. Этот URL-адрес может быть задан параметром application.properties, например webclient.url=https://my.domain.com/, чтобы я мог переопределить это поле в тесте junit. Но только статически.
Вопрос: как я могу сбросить bean-компонент WebClient внутри @SpringBootTest, чтобы он всегда отправлял запросы на мой макет сервер?
@Service
public class WebClientService {
public WebClientService(WebClient.Builder builder, @Value("${webclient.url}" String url) {
this.webClient = builder.baseUrl(url)...build();
}
public Response send() {
return webClient.body().exchange().bodyToMono();
}
}
@Service
public void CallingService {
@Autowired
private WebClientService service;
public void call() {
service.send();
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyWebTest {
@Autowired
private CallingService calling;
@Test
public void test() {
MockWebServer mockWebServer = new MockWebServer();
System.out.println("Current mock server url: " + mockWebServer.url("/").toString()); //this is random
mockWebServer.enqueue(new MockResponse()....);
//TODO how to make the mocked server url public to the WebClient?
calling.call();
}
}
Как видите, я пишу полноценный интеграционный тест junit в реальном мире. Единственная проблема: как я могу передать URL-адрес и порт MockWebServer в WebClient, чтобы он автоматически отправлял запросы на мой макет??
Примечание: мне определенно нужен случайный порт в MockWebServer, чтобы не мешать другим запущенным тестам или приложениям. Таким образом, придется придерживаться случайного порта и найти способ передать его веб-клиенту (или динамически переопределить свойство приложения).
Обновление:
Я придумал следующее, и оно работает. Но, может быть, кто-нибудь знает, как сделать поле макетного сервера нестатическим?
@ContextConfiguration(initializers = RandomPortInitializer.class)
public abstract class AbstractITest {
@ClassRule
public static final MockWebServer mockWebServer = new MockWebServer();
public static class RandomPortInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext,
"webclient.url=" + mockWebServer.url("/").toString());
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/571 ... junit-test
Как установить порт MockWebServer на WebClient в тесте JUnit? ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1722247221
Anonymous
Я использую Spring-Boot с WebClient, который автоматически подключается как bean-компонент.
Проблема: при написании junit< /code> интеграционный тест, мне нужно использовать okhttp MockWebServer. Этот макет всегда запускается на случайном порту, например, localhost:14321.
Теперь мой веб-клиент, конечно, имеет фиксированный URL-адрес, который он отправляет. запросы к. Этот URL-адрес может быть задан параметром application.properties, например webclient.url=https://my.domain.com/, чтобы я мог переопределить это поле в тесте junit. Но только статически.
Вопрос: как я могу сбросить bean-компонент WebClient внутри @SpringBootTest, чтобы он всегда отправлял запросы на мой макет сервер?
@Service
public class WebClientService {
public WebClientService(WebClient.Builder builder, @Value("${webclient.url}" String url) {
this.webClient = builder.baseUrl(url)...build();
}
public Response send() {
return webClient.body().exchange().bodyToMono();
}
}
@Service
public void CallingService {
@Autowired
private WebClientService service;
public void call() {
service.send();
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyWebTest {
@Autowired
private CallingService calling;
@Test
public void test() {
MockWebServer mockWebServer = new MockWebServer();
System.out.println("Current mock server url: " + mockWebServer.url("/").toString()); //this is random
mockWebServer.enqueue(new MockResponse()....);
//TODO how to make the mocked server url public to the WebClient?
calling.call();
}
}
Как видите, я пишу полноценный интеграционный тест junit в реальном мире. Единственная проблема: как я могу передать URL-адрес и порт MockWebServer в WebClient, чтобы он автоматически отправлял запросы на мой макет??
Примечание: мне определенно нужен случайный порт в MockWebServer, чтобы не мешать другим запущенным тестам или приложениям. Таким образом, придется придерживаться случайного порта и найти способ передать его веб-клиенту (или динамически переопределить свойство приложения).
[b]Обновление[/b]:
Я придумал следующее, и оно работает. Но, может быть, кто-нибудь знает, как сделать поле макетного сервера нестатическим?
@ContextConfiguration(initializers = RandomPortInitializer.class)
public abstract class AbstractITest {
@ClassRule
public static final MockWebServer mockWebServer = new MockWebServer();
public static class RandomPortInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext,
"webclient.url=" + mockWebServer.url("/").toString());
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/57186938/how-to-set-mockwebserver-port-to-webclient-in-junit-test[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия