MockMvc访问MockMvc将使用的MockHttpServletRequest对象

时间:2020-02-28 20:14:14

标签: spring junit controller easymock mockmvc

无论如何,在执行时,是否有要保留的模拟请求将使用的实际请求对象: mockMvc.perform(RequestBuilder requestBuilder)

我知道我可以自己建立请求(即)

Integer id = new Integer(1);
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/myPath").param(Constants.ACTION, Constants.GET_DETAIL)
  .param(Constants.ID, id.toString());
MockHttpServletRequest request = requestBuilder.buildRequest(wac.getServletContext());

但是我无法传递此请求,因为mockMvc.perform方法专门仅接受将创建MockHttpServletRequest的新实例的生成器。我正在使用EasyMock(至少在默认情况下)在其匹配器中使用equals(),由于在MockHttpServletRequest中缺少equals()实现,它仅比较对象ID。即

      EasyMock.reset(localeHelper);

  localeHelper.getLocale(request);
  EasyMock.expectLastCall().andReturn(locale);
  /* this matcher will always fail because the request object is rebuilt by the mockMvc.perform(requestBuilder) call 
    and MockHttpServletRequest does not have an equals() method that these mocking tools can fall back on for object equivalency */
  EasyMock.replay(localeHelper);

1 个答案:

答案 0 :(得分:0)

您可能想要捕获。

Capture<HttpServletRequest> capture  = EasyMock.newCapture();
EasyMock.expect(localeHelper.getLocale(EasyMock.capture(capture))).andReturn(locale);
EasyMock.replay(localeHelper);

mockMvc.perform(requestBuilder);

HttpServletRequest request = capture.getValue();
// Then assert whatever you want on the `request` that was received in parameter by the mock