So testen Sie DeferredResult timeoutResult
Ich implementiere Long Polling nach dem Spring Blog von vor einiger Zeit.
Hier meine konvertierte Methode mit der gleichen Antwortsignatur wie zuvor, aber anstatt sofort zu antworten, wird jetzt langes Polling verwendet:
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;
}
Insbesondere möchte ich das @ zurückgebpendingOnTimeout
Antwort, wenn die Anforderung zu lange dauert (was ich unmittelbar zuvor zurückgegeben habe), um zu verhindern, dass Proxys die Anforderung abschneiden.
Nun denke ich, dass ich das so gemacht habe, aber ich würde gerne einen Unittest schreiben, der dies bestätigt. Bei all meinen Versuchen, MockMvc (über webAppContextSetup) zu verwenden, kann ich jedoch nicht behaupten, dass ich ein @ erhaltaccepted
Header. Wenn ich zum Beispiel Folgendes versuche:
@Test
public void pollPending() throws Exception {
MvcResult result = mockMvc.perform(get("/poll/{uuid}", uuidPending)).andReturn();
mockMvc.perform(asyncDispatch(result))
.andExpect(status().isAccepted());
}
Ich erhalte den folgenden Stacktrace:
java.lang.IllegalStateException: Async-Ergebnis für Handler [public org.springframework.web.context.request.async.DeferredResult> nl.bioprodict.blast.api.PollController.poll (java.lang.String)] wurde während nicht festgelegt Die angegebene timeToWait = 25000 bei org.springframework.util.Assert.state (Assert.java:392) bei org.springframework.test.web.servlet.DefaultMvcResult.getAsyncResult (DefaultMvcResult.java:143) bei org.springframework.test. web.servlet.DefaultMvcResult.getAsyncResult (DefaultMvcResult.java:120) unter org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch (MockMvcRequestBuilders.java: PollControllerDocumentation.java:53) ...
The Spring Framework-Tests im Zusammenhang damit, dass ich alle Verwendung spöttisch finden könnte, wie es scheint:https: //github.com/spring-projects/spring-framework/blob/master/spring-web/src/test/java/org/springframework/web/context/request/async/WebAsyncManagerTimeoutTests.jav
Wie kann ich die korrekte Behandlung des TimeoutResult von DeferredResult testen?