Como testar DeferredResult timeoutResult

Estou implementandolonga pesquisa de acordo com o blog da Primavera de algum tempo atrás.

Aqui, meu método convertido com a mesma assinatura de resposta de antes, mas em vez de responder imediatamente, agora usa uma pesquisa longa:

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;
}

Em particular, gostaria de devolver opendingOnTimeout resposta quando a solicitação demora muito (que retornei imediatamente antes), para impedir que os proxies cortem a solicitação.

Agora, acho que consegui fazer isso como está, mas gostaria de escrever um pouco mais que confirme isso. No entanto, todas as minhas tentativas de usar o MockMvc (via webAppContextSetup) falham em fornecer um meio de afirmar que recebo umaccepted cabeçalho. Quando, por exemplo, tente o seguinte:

@Test
public void pollPending() throws Exception {
    MvcResult result = mockMvc.perform(get("/poll/{uuid}", uuidPending)).andReturn();
    mockMvc.perform(asyncDispatch(result))
            .andExpect(status().isAccepted());
}

Eu recebo o seguinte stacktrace:

java.lang.IllegalStateException: o resultado assíncrono do manipulador [public org.springframework.web.context.request.async.DeferredResult> nl.bioprodict.blast.api.PollController.poll (java.lang.String)] não foi definido durante o timeToWait = 25000 especificado em org.springframework.util.Assert.state (Assert.java:392) em org.springframework.test.web.servlet.DefaultMvcResult.getAsyncResult (DefaultMvcResult.java:143) em org.springframework.test.web .servlet.DefaultMvcResult.getAsyncResult (DefaultMvcResult.java:120) em org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch (MockMvcRequestBuilders.java:235) em nl.bioprodict.blastollerDocumentationControllerDocuments .java: 53) ...

Os testes de estrutura do Spring relacionados a isso, que eu poderia encontrar em todos os usos, parecem:https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/test/java/org/springframework/web/context/request/async/WebAsyncManagerTimeoutTests.java

Como testar a manipulação correta do timeoutResult DeferredResult?

questionAnswers(2)

yourAnswerToTheQuestion