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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage