【问题标题】:Spring MockMVC inject mockHttpServletRequest when not in method signature当不在方法签名中时,Spring MockMVC 注入 mockHttpServletRequest
【发布时间】:2013-08-31 10:55:32
【问题描述】:

鉴于我已经继承了一些带有签名的 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() 方法调用呢?

【问题讨论】:

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


    【解决方案1】:

    您可以添加RequestPostProcessor。然后,您可以使用 with() 方法将其传递给 mockmvc 内容。

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

    类似的东西应该可以。

    【讨论】:

    • 我试过这个,但 request.getRemoteAddr() 返回 127.0.0.1 我认为这是默认行为。 :(
    • 如果setRemoteAddr 被调用,则不会。所以你的解决方案/设置/测试代码一定有问题......
    • 绝对有效。现在您可以使用 Java 8 lambda 来完成它。
    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 2023-03-12
    • 2019-08-05
    • 2017-01-05
    • 2018-10-22
    • 1970-01-01
    • 2021-05-24
    • 2010-11-12
    相关资源
    最近更新 更多