1
resposta

Teste assincrono nao esta funcionando.

Olá,

fiz as verificações do codigo, baixei o codigo final, testei o metodo buscarEvento() do meu teste no codigo do curso e ele funciona, assim como o buscarEvento() do curso no meu codigo da o mesmo erro.

Ok, teste do metodo feito conclui que eu tenho algum erro de configuração.

Então passei para o Debug minucioso por linha usando o codigo a seguir: logging.level.org.springframework.web=DEBUG logging.level.org.springframework.web.reactive=DEBUG logging.level.org.springframework.web.server.adapter.HttpWebHandlerAdapter=DEBUG

.. e fora o "o.s.w.s.adapter.HttpWebHandlerAdapter : [1b201fb4-1] Completed 200 OK" e o "o.s.w.r.f.client.ExchangeFunctions : [3462e99a] [3755ada1-1] Response 200 OK" aparecerem em momentos totalmente diferentes eu só tenho o erro de timeout:

Preciso de ajuda para entender o que no caso me parece ser um erro na deserialização de objeto ja que no log aparece o encoding e o decoded completos e com codigo 200.

O codigo ta nesse repositorio: https://github.com/arfranzim/ticket-management

Erro: # tirei a parte do encoded e decoding devido ao limite de caracteres. #

java.lang.IllegalStateException: Timeout on blocking read for 5000000000 NANOSECONDS

at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:129)
at reactor.core.publisher.Mono.block(Mono.java:1807)
at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultResponseSpec.getListBodySpec(DefaultWebTestClient.java:459)
at org.springframework.test.web.reactive.server.DefaultWebTestClient$DefaultResponseSpec.expectBodyList(DefaultWebTestClient.java:449)
at com.portfolio.webflux.ticket_management.TicketManagementApplicationTests.buscarEvento(TicketManagementApplicationTests.java:45)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

Caused by: java.util.concurrent.TimeoutException: Timeout on blocking read for 5000000000 NANOSECONDS ... 8 more

1 resposta

Olá! Olhei seu código e vi que o endpoint /sse está usando SSE (Server-Sent Events), que é uma forma de enviar dados do servidor para o navegador em tempo real, como uma "stream" de mensagens.

No seu caso, ele envia uma nova mensagem a cada 4 segundos, e isso nunca para. É assim mesmo que o SSE funciona.

O problema do seu teste está justamente aí: Quando você usa expectBodyList().hasSize(1), o teste fica esperando a resposta terminar, mas como o SSE é contínuo, isso nunca acontece. Aí dá o erro de Timeout.

Como resolver isso?

Em vez de esperar o corpo todo, você pode pegar só os primeiros eventos e depois encerrar a verificação com o StepVerifier.

@Test
void deveReceberEventosSSE() {
    var result = webTestClient.get()
        .uri("/sse")
        .accept(MediaType.TEXT_EVENT_STREAM)
        .exchange()
        .expectStatus().isOk()
        .returnResult(String.class);

    StepVerifier.create(result.getResponseBody())
        .expectNextMatches(event -> event.startsWith("Evento:"))
        .thenCancel() // encerra o teste antes de travar
        .verify();
}

Esse teste funciona porque ele escuta os primeiros eventos, verifica se são do jeito esperado e depois cancela a conexão antes de travar.

Se o seu teste estava tentando usar .block() ou esperando o corpo inteiro, esse era o motivo do erro de timeout.