Cómo probar DeferredResult timeoutResult
Estoy implementandolargas encuestas según el blog de Spring de hace algún tiempo.
Aquí mi método convertido con la misma firma de respuesta que antes, pero en lugar de responder de inmediato, ahora utiliza un sondeo largo:
private Map<String, DeferredResult<ResponseEntity<?>>> requests = new ConcurrentHashMap<>();
@RequestMapping(value = "/{uuid}", method = RequestMethod.GET)
public DeferredResult<ResponseEntity<?>> poll(@PathVariable("uuid") final String uuid) {
// Create & store a new instance
ResponseEntity<?> pendingOnTimeout = ResponseEntity.accepted().build();
DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(TWENTYFIVE_SECONDS, pendingOnTimeout);
requests.put(uuid, deferredResult);
// Clean up poll requests when done
deferredResult.onCompletion(() -> {
requests.remove(deferredResult);
});
// Set result if already available
Task task = taskHolder.retrieve(uuid);
if (task == null)
deferredResult.setResult(ResponseEntity.status(HttpStatus.GONE).build());
else
// Done (or canceled): Redirect to retrieve file contents
if (task.getFutureFile().isDone())
deferredResult.setResult(ResponseEntity.created(RetrieveController.uri(uuid)).build());
// Return result
return deferredResult;
}
En particular, me gustaría devolver elpendingOnTimeout
respuesta cuando la solicitud tarda demasiado (que devolví inmediatamente antes), para evitar que los representantes corten la solicitud.
Ahora creo que he conseguido que funcione como está, pero me gustaría escribir una prueba unitaria que lo confirme. Sin embargo, todos mis intentos de usar MockMvc (a través de webAppContextSetup) no me proporcionan un medio para afirmar que obtengo unaccepted
encabezamiento. Cuando, por ejemplo, intento lo siguiente:
@Test
public void pollPending() throws Exception {
MvcResult result = mockMvc.perform(get("/poll/{uuid}", uuidPending)).andReturn();
mockMvc.perform(asyncDispatch(result))
.andExpect(status().isAccepted());
}
Me sale el siguiente stacktrace:
java.lang.IllegalStateException: El resultado asíncrono para el controlador [public org.springframework.web.context.request.async.DeferredResult> nl.bioprodict.blast.api.PollController.poll (java.lang.String)] no se configuró durante el timeToWait = 25000 especificado en org.springframework.util.Assert.state (Assert.java:392) en org.springframework.test.web.servlet.DefaultMvcResult.getAsyncResult (DefaultMvcResult.java:143) en org.springframework.test.web .servlet.DefaultMvcResult.getAsyncResult (DefaultMvcResult.java:120) en org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch (MockMvcRequestBuilders.java:235. .java: 53) ...
Las pruebas del marco de Spring relacionadas con esto que podría encontrar que todo el uso se burla parece:https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/test/java/org/springframework/web/context/request/async/WebAsyncManagerTimeoutTests.java
¿Cómo puedo probar el manejo correcto de DeferredResult timeoutResult?