2013-08-28 8 views
9

को देखते हुए मैं हस्ताक्षरस्प्रिंग MockMVC mockHttpServletRequest इंजेक्षन जब विधि हस्ताक्षर में

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
public ModelAndView upload(HttpServletRequest request, HttpServletResponse response) { 

    String remoteAddress = request.getRemotedAddr(); 
    auditService.logAddress(remoteAddress); 

    // do work... 

    return mav; 
} 

के साथ कुछ वसंत MVC नियंत्रक कोड विरासत में मिला है और मैं एक स्प्रिंग MockMvc परीक्षण है कि परीक्षण

public void someTest() { 
    mockMvc().perform(fileUpload("/upload").file(FileFactory.stringContent("myFile"))); 

    // do work... 
    verify(auditService.logAddress("123456")); 
} 

मैं जरूरत नहीं करता है दूरस्थ अपलोड को HttpServletRequest ऑब्जेक्ट पर "12345" पर सेट करने के लिए जो मेरे अपलोड नियंत्रक विधि में पारित किया गया है, इसलिए मैं परीक्षण में ऑडिट सेवा पर कॉल करने के लिए कॉल को सत्यापित कर सकता हूं।

मैं एक MockHttpServletRequest वस्तु बना सकते हैं और setRemoteAddr कॉल कर सकते हैं() विधि है, लेकिन कैसे mockMvc() विधि कॉल करने के लिए इस नकली अनुरोध वस्तु पारित करने के लिए?

उत्तर

17

आप RequestPostProcessor जोड़ सकते हैं। जिसे आप with() विधि का उपयोग कर mockmvc सामान में पास कर सकते हैं।

mockMvc().perform(
    fileUpload("/upload") 
    .file(FileFactory.stringContent("myFile")) 
    .with(new RequestPostProcessor() { 
    public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) { 
     request.setRemoteAddr("12345"); 
     return request; 
    }})); 

ऐसा कुछ काम करना चाहिए।

+0

मैंने कोशिश की, लेकिन request.getRemoteAddr() 127.0.0.1 देता है जो मुझे लगता है कि डिफ़ॉल्ट व्यवहार है। :( –

+0

नहीं यदि 'setRemoteAddr' कहा जाता है। तो आपके समाधान/सेटअप/testcode के साथ कुछ गड़बड़ होना चाहिए ... –

+1

निश्चित रूप से काम करता है। और अब आप इसे करने के लिए जावा 8 लैम्ब्डा का उपयोग कर सकते हैं। – objectuser

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