如何在 Spring 中为单元测试创​​建 HttpServletResponse?

How to create HttpServletResponse for unit tests in Spring?

如何为单元测试创​​建 HttpServletResponse,我可以在其中编写输出流和 headers(不是 MockHttpServletResponse)? 在断言块中,我希望将 OutputStream 和 headers 与标准具 httpServletResponse.

进行比较

我使用了 Spring4java8EasyMock 库。

使用 spring-test 依赖项,您可以使用 class MockHttpServletResponse

此 class 包含获取结果流内容的方法,例如;

  • byte[] getContentAsByteArray()
  • 字符串 getContentAsString()

也有检查headers的方法。

有关 class 的更多信息,您可以访问:

Spring Test documentation 中有一些关于 Servlet API 的有趣信息用于测试。此外,本文档建议在使用 EasyMock 等其他组件之前使用 Spring 测试组件来测试 Spring classes

These mock objects are targeted at usage with Spring’s Web MVC framework and are generally more convenient to use than dynamic mock objects such as EasyMock or alternative Servlet API mock objects such as MockObjects.

最好使用 EasyMock 在没有 Spring 的情况下测试您的 classes 和服务,并使用 Spring 测试运行器和 spring 测试框架实用程序来测试 Spring 组件,例如 Spring MVC,Spring 安全,...

下面使用 EasyMock 的方式

 HttpServletRequest mockRequest = EasyMock.createMock(HttpServletRequest.class);
 HttpServletResponse mockResponse = EasyMock.createMock(HttpServletResponse.class);

使用 spring 模拟 class

import  org.springframework.mock.web.MockHttpServletResponse;
import  org.springframework.mock.web.MockHttpServletRequest;

HttpServletRequest httpServletRequest = new MockHttpServletRequest();
HttpServletResponse httpServletResponse = new MockHttpServletResponse();

使用 powermock-api-mockito,可以模拟 HttpServletResponse 并验证响应 headers。

Java 来自 servlet 方法的代码片段:

response.setHeader("Cache-Control", "max-age=123456789");
response.setHeader("Content-Type", "video/mp4");
response.setHeader("Content-Disposition", "inline");
response.setHeader("Accept-Ranges","bytes");

单元测试:

import static org.mockito.Mockito.mock
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

final HttpServletResponse response = mock(HttpServletResponse.class);
final HttpServletRequest request = mock(HttpServletRequest.class);
servlet.doGet();
verify(response).setHeader("Cache-Control", "max-age=123456789");
verify(response).setHeader("Content-Type", "video/mp4");
verify(response).setHeader("Content-Disposition", "inline");
verify(response).setHeader("Accept-Ranges","bytes");

verify(response).setHeader("Content-Length","421854");      
verify(response, times(1)).setHeader("Accept-Ranges","bytes");

为了存根 OutputStream,你可以使用 当(response.getOutputStream()).thenReturn(模拟(ServletOutputStream.class));

这个答案中有更多有用的信息 https://whosebug.com/a/24593642/3511379