Я использую 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