Как проверить 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
ответ, когда запрос занимает слишком много времени (который я возвратил непосредственно перед этим), чтобы прокси-серверы не обрезали запрос.
Теперь я думаю, что у меня все работает как есть, но я бы хотел написать тестовый блок, который подтверждает это. Тем не менее, все мои попытки использовать MockMvc (через webAppContextSetup) не дают мне средства утверждать, что я получаюaccepted
заголовок. Когда я, например, попробуйте следующее:
@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?