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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta