मैं एक लंबे समय से चल बैकएंड प्रक्रिया शुरू करने के लिए (यह एक क्रोन शेड्यूल पर सामान्य रूप से है, लेकिन हम इसे मैन्युअल रूप से शुरू की क्षमता चाहते हैं) एक शोकहारा यूआरएल उपयोग कर रहा हूँ।परीक्षण स्प्रिंग asyncResult() और jsonPath() एक साथ
नीचे दिया गया कोड काम करता है और जब मैं मैन्युअल रूप से परीक्षण करता हूं तो मुझे ब्राउज़र में परिणाम दिखाई देता है।
@ResponseBody
@RequestMapping(value = "/trigger/{jobName}", method = RequestMethod.GET)
public Callable<TriggerResult> triggerJob(@PathVariable final String jobName) {
return new Callable<TriggerResult>() {
@Override
public TriggerResult call() throws Exception {
// Code goes here to locate relevant job and kick it off, waiting for result
String message = <result from my job>;
return new TriggerResult(SUCCESS, message);
}
};
}
जब मैं Callable
के बिना इस परीक्षण मैं नीचे दिए गए कोड का इस्तेमाल किया और यह सब काम करता है (मैं पद को आसान बनाने की उम्मीद त्रुटि संदेश परिवर्तित)।
mockMvc.perform(get("/trigger/job/xyz"))
.andExpect(status().isOk())
.andDo(print())
.andExpect(jsonPath("status").value("SUCCESS"))
.andExpect(jsonPath("message").value("A meaningful message appears"));
जब मैंने Callable
जोड़ा, हालांकि यह काम नहीं करता है। मैंने नीचे भी कोशिश की लेकिन यह काम नहीं किया। किसी और को सफलता मिली?
mockMvc.perform(get("/trigger/job/xyz"))
.andExpect(status().isOk())
.andDo(print())
.andExpect(request().asyncResult(jsonPath("status").value("SUCCESS")))
.andExpect(request().asyncResult(jsonPath("message").value("A meaningful message appears")));
नीचे मेरे प्रिंट() से प्रासंगिक हिस्सा है। ऐसा लगता है कि mockMvc इस मामले में जेसन को सही तरीके से उलझा नहीं सकता है (भले ही यह मेरे ब्राउज़र में काम करता हो)? जब मैं Callable
के बिना ऐसा करता हूं तो मुझे पूर्ण JSON दिखाई देता है।
MockHttpServletRequest:
HTTP Method = GET
Request URI = /trigger/job/xyz
Parameters = {}
Headers = {}
Handler:
Type = foo.bar.web.controller.TriggerJobController
Method = public java.util.concurrent.Callable<foo.bar.myproject.web.model.TriggerResult> foo.bar.myproject.web.controller.TriggerJobController.triggerJob(java.lang.String)
Async:
Was async started = true
Async result = [email protected]
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
MockHttpServletResponse:
Status = 200
Error message = null
Headers = {}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
यह इंगित करना अच्छा होगा कि विधि 'instanceOf() 'हैमक्रिस्ट लाइब्रेरी का हिस्सा है। इसे खोजने के लिए मुझे थोड़ी देर लग गई और फिर उचित ** मेवेन ** आयात डाला। इस [एमवीसी शोकेस उदाहरण] पर एक नज़र डालें (https://github.com/spring-projects/spring-mvc-showcase/blob/master/src/test/java/org/springframework/samples/mvc/async/CallableControllerTests .java) मदद की। –
निश्चित, अच्छा बिंदु। जोड़ा गया। –
asyncDispatch() पूरी तरह से आवश्यक उपयोग कर रहा है? ऐसा लगता है कि परीक्षण के encapsulation तोड़ने के लिए लगता है - जो सिर्फ यह पता होना चाहिए कि जब यह एक जीईटी/ट्रिगर/नौकरी/xyz को जीईटी भेजता है - यह जानने के लिए कि उस नियंत्रक के कार्यान्वयन async –