Как проверить DeferredResult timeoutResult

Я реализуюдлительный опрос согласно весеннему блогу с некоторого времени назад.

Здесь мой преобразованный метод с той же сигнатурой ответа, что и раньше, но вместо немедленного ответа теперь используется длинный опрос:

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

В частности, я хотел бы вернутьpendingOnTimeout&nbsp;ответ, когда запрос занимает слишком много времени (который я возвратил непосредственно перед этим), чтобы прокси-серверы не обрезали запрос.

Теперь я думаю, что у меня все работает как есть, но я бы хотел написать тестовый блок, который подтверждает это. Тем не менее, все мои попытки использовать MockMvc (через webAppContextSetup) не дают мне средства утверждать, что я получаюaccepted&nbsp;заголовок. Когда я, например, попробуйте следующее:

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

Я получаю следующую трассировку стека:

java.lang.IllegalStateException: асинхронный результат для обработчика [public org.springframework.web.context.request.async.DeferredResult> nl.bioprodict.blast.api.PollController.poll (java.lang.String)] не был установлен во время указанное времяToWait = 25000 в org.springframework.util.Assert.state (Assert.java:392) в org.springframework.test.web.servlet.DefaultMvcResult.getAsyncResult (DefaultMvcResult.java:143) в org.spring.wef .servlet. .java: 53) ...

Весенние тесты фреймворка, связанные с этим, мне кажется, что все они используют насмешкиhttps://github.com/spring-projects/spring-framework/blob/master/spring-web/src/test/java/org/springframework/web/context/request/async/WebAsyncManagerTimeoutTests.java

Как я могу проверить правильную обработку DeferredResult timeoutResult?