- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我编写的过滤器编写单元测试。这听起来很简单,但有一点我不太明白是哪个设置了 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(...)
但是,因为我正在为状态创建自定义包装器,所以似乎不可能设置此局部变量的状态代码,因为它在包装器中以 int 形式保存,该包装器会覆盖 HttpServletResponse setStatus。
因此,我可以使用 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() ,它将被包装器拦截;
private IncludedResponse servletResponse;
servletResponse = new IncludedResponse();
servletResponse.setProxiedHttpServletResponse(new IncludedResponse());
如果您能提供任何帮助,我们将不胜感激。
非常感谢
最佳答案
when(myServletResponse).getStatus().thenReturn(...)
正确的是
when(myServletResponse.getStatus()).thenReturn(...)
或者更改为更通用的形式:
doReturn(...).when(myServletResponse).getStatus()
它还允许在 void 方法上抛出异常:
doThrow(new *Exception())when(mock).veoidMethod();
<小时/>
I can't do that either (the doReturn) part as how can I mock the wrapper as a local variable. That's why I need to set the original ServletResponse.setStatus method
如果您应用依赖注入(inject),您可以轻松使用本地模拟。
关于java - 使用响应包装器通过 Mockito 测试 ServletFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42855514/
我正在尝试为我编写的过滤器编写单元测试。这听起来很简单,但有一点我不太明白是哪个设置了 ServletResponse 的状态代码。不幸的是,这很复杂,因为我正在使用 HttpServletRespo
我将所有应用程序属性和配置放入 hippo 资源包中,并(基于 channel )放入 channel 设置 (ChannelInfo) 中。 有什么方法可以从 ServletFilter 访问 ch
我想将 session bean 注入(inject)到我的 ServletFilter 中,这似乎不起作用。你能告诉我如何实现这一点吗? public class MyExample impleme
因此,我们几乎已经达到了测试驱动我们的 spring web-mvc 应用程序的目标。我们正在使用 spring security 来保护 URL 或方法,我们想使用 Spring-Web-Mvc 来
我是一名优秀的程序员,十分优秀!