WebClient로 인해 JUnit에서 "java.lang.IllegalStateException : executor not accepting a task"가 발생합니다.

기욤 블랑 쉐

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

".exchange ()"뒤에 ".block ()"을 추가하여 호출을 동 기적으로 수행하고 모든 것이 잘 작동하기 시작할 때까지.

JUnit이 특수 스레드 컨텍스트 또는 이와 유사한 것을 시작한다고 생각합니다. 무슨 일이 일어나고 있는지 아십니까?

고마워

생명을줍니다.

문제는 함수가 testWebClient()완료되면 모든 비동기 프로세스가 종료된다는 것입니다.

이 경우 WebClient비동기 작업을 사용하고 있으므로 답변을 얻을 수 testWebClient()있기 전에 함수가 완료 WebClient됩니다.

이를 방지하기 위해 다음을 수행 할 수 있습니다.

  • 와 같은 스레드 절전 방법을 사용하십시오 TimeUnit.SECONDS.sleep(5).
  • 다음과 같은 외부 라이브러리를 사용하십시오. Awaitility

Awaitility의 예


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

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

따라서이 경우 함수는 작업이 완료 될 때까지 대기합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관