es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La prueba con MockWebServer nunca termina.

Tengo una clase que implementa CommandLineRunner y en su método run, un webClient realiza una solicitud y realiza algún procesamiento con la respuesta, incluido un método que quiero verificar en una prueba:

@RequiredArgsConstructor
public class WowGreatClass implements CommandLineRunner {
    private final WebClient webClient;

    @Override
    public void run(String... args) {
        webClient.get()
        .uri("/foo")
        .retrieve()
        .bodyToMono(PairsResponseDto.class)
        .flatMap(response -> Flux.fromIterable(response.getResult()))
        .collectList()
        .map(this::methodToTest)
        //...
        .block(); 
    }
}

Entonces, en la prueba estoy usando un MockWebServer de la siguiente manera:

@ExtendWith(MockitoExtension.class)
public class WowGreatTest {
    MockWebServer mockServer = new MockWebServer();

    @Spy
    WowGreatClass greatClass = new WowGreatClass(WebClient.create(mockServer.url("/").toString()));

    @Captor
    ArgumentCaptor<string> captor;

    @Test
    public void testTheThing() {
        mockServer.enqueue(
            new MockResponse()
                .setResponseCode(200)
                .addHeader("Content-Type", "application/json")
                .setBody("something really interesting"));

        greatClass.run();
        verify(greatClass).methodToTest(captor.capture());
    }
}

El MockWebServer hace lo que debe durante la prueba, el problema es que después de la solicitud inicial parece quedarse esperando indefinidamente. El método run() nunca termina y la llamada a verify() nunca se alcanza. ¿Me estoy perdiendo algo obvio aquí, o qué está mal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el operador flatMap en el método run no se está completando, lo cual está causando que el método block bloquee indefinidamente. Una posible solución podría ser agregar un operador then después de flatMap, de la siguiente manera:

    .flatMap(response -> Flux.fromIterable(response.getResult()))
    .collectList()
    .map(this::methodToTest)
    .then()
    .block(); 
    

    Esto debería asegurar que el flatMap se complete antes de pasar al siguiente operador, permitiendo que el método block se desbloquee y se alcance la llamada a verify en la prueba.

Comments are closed.