【发布时间】:2017-03-17 10:49:09
【问题描述】:
我正在尝试为我编写的过滤器编写单元测试。这听起来很简单,但有一点我不太清楚是哪个设置了 ServletResponse 的状态代码。不幸的是,这很复杂,因为我使用的是 HttpServletResponseWrapper,因为我需要检查响应状态代码(因为我需要覆盖它并返回 200)。作为参考,我返回了一个 IncludedResponse,它确实有一个 getStatusCode() 但由于某种原因在 JDK 源代码中它返回 0?!?无论如何,这是我拥有的过滤器的一部分:
private void handleUploadFilePost(ServletResponse servletResponse, HttpServletResponse httpServletResponse,
HttpServletRequest httpServletRequest, FilterChain filterChain) throws IOException, ServletException {
RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);
ResponseWrapper responseWrapper = new ResponseWrapper(httpServletResponse);
String requestBodyTrimmed = getRequestBody(requestWrapper.getInputStream());
Case caseDetails = requestBodyMappingHelper.mapRequestBody(requestBodyTrimmed, Case.class);
filterChain.doFilter(requestWrapper, responseWrapper);
if (responseWrapper.getStatus() >= 400 && responseWrapper.getStatus() <= 599) {
...
}
}
不幸的是,这会在测试时产生问题。如果它是一个简单的 ServletResponse,我会对其进行模拟并执行...
when(myServletResponse).getStatus().thenReturn(...)
但是,由于我正在为状态创建自定义包装器,因此似乎无法设置此局部变量的状态代码,因为它在覆盖 HttpServletResponse setStatus 的包装器中作为 int 保存。
因此,我可以使用 Mockito 或 Powermock 来做我想做的事情吗?当设置 HttpServletResponse 值时,它会覆盖它并将状态存储在我的包装器中,但我无法让它工作。我已经尝试了以下方法:
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
servletResponse.setStatus(400);
return null; // void method, so return null
}
}).when(filterChain).doFilter(Mockito.any(ServletRequest.class), Mockito.any(ServletResponse.class));
但这由于某种原因不起作用。测试中的 ServletResponse 没有被模拟,我实际上是在创建它,以便它触发它的 setStatus(),它会被 Wrapper 拦截;
private IncludedResponse servletResponse;
servletResponse = new IncludedResponse();
servletResponse.setProxiedHttpServletResponse(new IncludedResponse());
您能提供的任何帮助将不胜感激。
非常感谢
【问题讨论】: