2015-12-17 11 views
9

मैं 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 का सही से निपटने के कैसे परीक्षण करूं?

+0

स्पष्ट है: यह एकीकरण परीक्षणों में अच्छा काम करने लगता है, लेकिन मैं यह भी 'वसंत-restdocs-mockmvc' में यह परीक्षण करना चाहते हैं चाहते हैं। – Tim

+0

मैंने अभी इस सटीक मुद्दे पर भाग लिया है। क्या आपको कभी ऐसा समाधान मिला है जो DeferredResults पर टाइमआउट का परीक्षण करने की अनुमति देता है? –

+0

@ जॉन नहीं, अभी तक नहीं है, हालांकि मैं अब की तलाश में बंद कर दिया है .. आप कुछ भी करता है, तो मुझे पता है! – Tim

उत्तर

3

मेरे मामले में, वसंत स्रोत कोड के माध्यम से जा रहा है और स्थापित करने टाइमआउट (10000 मिलीसेकंड) और async परिणाम प्राप्त करने के बाद के रूप में मेरे लिए इसे हल,;

mvcResult.getRequest().getAsyncContext().setTimeout(10000); 
mvcResult.getAsyncResult(); 

मेरा पूरा परीक्षण कोड था;

MvcResult mvcResult = this.mockMvc.perform(
           post("<SOME_RELATIVE_URL>") 
           .contentType(MediaType.APPLICATION_JSON) 
           .content(<JSON_DATA>)) 
         ***.andExpect(request().asyncStarted())*** 
          .andReturn(); 

***mvcResult.getRequest().getAsyncContext().setTimeout(10000);*** 
***mvcResult.getAsyncResult();*** 

this.mockMvc 
    .perform(asyncDispatch(mvcResult)) 
    .andDo(print()) 
    .andExpect(status().isOk()); 

आशा है कि यह मदद करता है ..

+0

धन्यवाद! जैसा कि मुझे लगता है कि यह किसी की मदद कर सकता है, लेकिन मेरे मामले में यह अभी तक '@SpringBootTest() 'और' @WebMvcTest (PollController.class)' के साथ काम नहीं करता है। दोनों फेंकते रहते हैं: 'निर्धारित परिणाम निर्दिष्ट समय के दौरान सेट नहीं किया गया था ToWait = 25000' .. धन्यवाद हालांकि! – Tim

संबंधित मुद्दे