当Spring不在方法签名中时,Spring MockMVC会注入mockHttpServletRequest

Ayu*_*lik 14 spring integration-testing controller mocking spring-mvc

鉴于我已经继承了一些带有签名的Spring MVC控制器代码

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

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

  // do work...

  return mav;
}
Run Code Online (Sandbox Code Playgroud)

我有一个执行测试的Spring MockMvc测试

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

    // do work...
    verify(auditService.logAddress("123456"));
}
Run Code Online (Sandbox Code Playgroud)

我需要在传递给我的上传控制器方法的HttpServletRequest对象上将远程地址设置为"12345",这样我就可以在测试中验证对模拟auditService的调用.

我可以创建一个MockHttpServletRequest对象并调用setRemoteAddr()方法,但是如何将这个模拟请求对象传递给mockMvc()方法调用?

M. *_*num 22

你可以添加一个RequestPostProcessor.然后,您可以使用该with()方法将其传递给mockmvc .

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

这样的事情应该有效.