मैं long polling as per the Spring blog from some time ago को लागू कर रहा हूँ परीक्षण करने के लिए।कैसे 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
प्रतिक्रिया वापस जाने के लिए जब अनुरोध भी लेता करना चाहते हैं अनुरोध को काटने से प्रॉक्सी को रोकने के लिए लंबे समय तक (जो मैंने तुरंत वापस लौटाया)।
अब मुझे लगता है कि मैं इस काम कर के रूप में है मिल गया है, लेकिन मैं एक unittest है कि इस बात की पुष्टि करता लिखने के लिए करना चाहते हैं। हालांकि 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: हैंडलर के लिए Async परिणाम [सार्वजनिक 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.springframework.test.web.servlet पर .DefaultMvcResult.getAsyncResult (DefaultMvcResult.java:120) org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch (MockMvcRequestBuilders.java:235) पर nl.bioprodict.blast.docs.PollControllerDocumentation.pollPending पर (PollControllerDocumentation जावा: इस से संबंधित 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 का सही से निपटने के कैसे परीक्षण करूं?
स्पष्ट है: यह एकीकरण परीक्षणों में अच्छा काम करने लगता है, लेकिन मैं यह भी 'वसंत-restdocs-mockmvc' में यह परीक्षण करना चाहते हैं चाहते हैं। – Tim
मैंने अभी इस सटीक मुद्दे पर भाग लिया है। क्या आपको कभी ऐसा समाधान मिला है जो DeferredResults पर टाइमआउट का परीक्षण करने की अनुमति देता है? –
@ जॉन नहीं, अभी तक नहीं है, हालांकि मैं अब की तलाश में बंद कर दिया है .. आप कुछ भी करता है, तो मुझे पता है! – Tim