2013-08-28 16 views
9

Dato ho ereditato qualche codice regolatore Spring MVC con firmaSpring MockMVC iniettare mockHttpServletRequest quando non in firma del metodo

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

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

    // do work... 

    return mav; 
} 

e ho un test Spring MockMvc che esegue il test

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

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

ho bisogno per impostare l'indirizzo remoto su "12345" sull'oggetto HttpServletRequest passato al metodo del mio controller di caricamento, in modo da poter verificare la chiamata a simulare auditService nel test.

posso creare un oggetto MockHttpServletRequest e chiamare il setRemoteAddr() metodo, ma come passare questo oggetto di richiesta finto al mockMvc() chiamata di metodo?

risposta

17

È possibile aggiungere un RequestPostProcessor. Che puoi quindi passare alla roba di mockmvc usando il metodo with().

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

Qualcosa del genere dovrebbe funzionare.

+0

Ho provato questo, ma request.getRemoteAddr() restituisce 127.0.0.1 che penso sia il comportamento predefinito. :( –

+0

Non se viene chiamato 'setRemoteAddr', quindi ci deve essere qualcosa di sbagliato con la soluzione/setup/testcode ... –

+1

Funziona sicuramente e ora è possibile utilizzare un lambda Java 8 per farlo. – objectuser

Problemi correlati