gpt4 book ai didi

java - WebClient 在 JUnit 中导致 "java.lang.IllegalStateException: executor not accepting a task"

转载 作者:行者123 更新时间:2023-12-04 08:52:55 25 4
gpt4 key购买 nike

我想在 JUnit 测试框架内使用响应式(Reactive)编程来对远程 rest 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

直到在“.exchange()”之后添加“.block()”以同步调用,一切开始正常工作。

我怀疑 JUnit 启动了一个特殊的线程上下文或类似的东西。你知道会发生什么吗?

非常感谢

最佳答案

问题在于,一旦函数 testWebClient() 完成,所有异步进程都将关闭。

在这种情况下,您使用的是异步作业 WebClient,因此函数 testWebClient()WebClient 可以获取回答。

为了防止这种情况,您可以:

  • 使用线程 hibernate 方法,如 TimeUnit.SECONDS.sleep(5)
  • 使用外部库,如 Awaitility

等待示例


bool taskDone = false;
@Test
void testWebClient() {
//...
var response = webClient.get()
//...
.doFinally(r->{
taskDone = true;
})

await().until(()-> taskDone);
}

因此在这种情况下,该函数将等待任务完成。

关于java - WebClient 在 JUnit 中导致 "java.lang.IllegalStateException: executor not accepting a task",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64002009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com