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?
davy.ai
Parece que el operador
flatMap
en el métodorun
no se está completando, lo cual está causando que el métodoblock
bloquee indefinidamente. Una posible solución podría ser agregar un operadorthen
después deflatMap
, de la siguiente manera:Esto debería asegurar que el
flatMap
se complete antes de pasar al siguiente operador, permitiendo que el métodoblock
se desbloquee y se alcance la llamada averify
en la prueba.