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

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

Сообщение 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, чтобы не мешать другим запущенным тестам или приложениям. Таким образом, придется придерживаться случайного порта и найти способ передать его веб-клиенту (или динамически переопределить свойство приложения).



Обновление:
Я придумал следующее, и оно работает. Но, может быть, кто-нибудь знает, как сделать поле макетного сервера нестатическим?

@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
Ответить

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

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

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

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

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