Я хотел использовать реактивное программирование внутри среды тестирования JUnit для выполнения системных тестов на api удаленного отдыха.
Я написал так:
@Test
void testWebClient() {
WebClient webClient = WebClient.builder()
.baseUrl(GITHUB_API_BASE_URL)
.defaultHeader(HttpHeaders.CONTENT_TYPE, GITHUB_V3_MIME_TYPE)
.defaultHeader(HttpHeaders.USER_AGENT, USER_AGENT)
.filter(ExchangeFilterFunctions
.basicAuthentication(appProperties.getGithub().getUsername(),
appProperties.getGithub().getToken()))
.build();
var response = webClient.get()
.uri("/user/repos?sort={sortField}&direction={sortDirection}",
"updated", "desc")
.exchange()
.doOnError(e -> {
System.out.println(e.toString());
})
.subscribe(r -> {
System.out.println(r );
});
}
чтобы получить все мои репозитории на github. Я все время ловил эту ошибку:
java.lang.IllegalStateException: executor not accepting a task
пока не добавите «.block ()» после «.exchange ()» для синхронного вызова, и все начнет работать нормально.
Я подозреваю, что JUnit запускает специальный контекст потока или что-то в этом роде. Вы знаете, что может происходить?
большое спасибо
Проблема в том, что после завершения функции testWebClient()
все асинхронные процессы закрываются.
В этом случае вы используете WebClient
это асинхронное задание, поэтому функция testWebClient()
завершается до того, как WebClient
сможет получить ответ.
Чтобы этого не произошло, вы можете:
TimeUnit.SECONDS.sleep(5)
.Awaitility
Пример с ожиданием
bool taskDone = false;
@Test
void testWebClient() {
//...
var response = webClient.get()
//...
.doFinally(r->{
taskDone = true;
})
await().until(()-> taskDone);
}
В этом случае функция будет ждать завершения задачи.
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения