gpt4 book ai didi

java - 使用响应包装器通过 Mockito 测试 ServletFilter

转载 作者:行者123 更新时间:2023-12-02 13:38:55 24 4
gpt4 key购买 nike

我正在尝试为我编写的过滤器编写单元测试。这听起来很简单,但有一点我不太明白是哪个设置了 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com