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

时间:2013-08-28 11:32:44

标签: spring spring-mvc controller mocking integration-testing

鉴于我已经继承了一些带有签名的

的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;
}

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

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

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

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

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

1 个答案:

答案 0 :(得分: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;
    }}));

这样的事情应该有用。