【问题标题】:How to create HttpServletResponse for unit tests in Spring?如何在 Spring 中为单元测试创​​建 HttpServletResponse?
【发布时间】:2018-08-08 05:43:45
【问题描述】:

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

我使用了Spring4java8EasyMock 库。

【问题讨论】:

    标签: java spring easymock


    【解决方案1】:

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

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

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

    还有一些检查标题的方法。

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

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

    这些模拟对象的目标是与 Spring 的 Web MVC 一起使用 框架,通常比动态模拟更方便使用 对象,例如 EasyMock 或替代 Servlet API 模拟对象,例如 作为 MockObjects。

    最好使用 EasyMock 在没有 Spring 的情况下测试您的类和服务,并使用 Spring test Runner 和 spring 测试框架实用程序来测试 Spring MVC、Spring Security 等 Spring 组件...

    【讨论】:

      【解决方案2】:

      以下方式使用 EasyMock

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

      使用spring mock类

      import  org.springframework.mock.web.MockHttpServletResponse;
      import  org.springframework.mock.web.MockHttpServletRequest;
      
      HttpServletRequest httpServletRequest = new MockHttpServletRequest();
      HttpServletResponse httpServletResponse = new MockHttpServletResponse();
      

      【讨论】:

        【解决方案3】:

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

        来自servlet方法的Java代码sn-p:

        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,您可以使用 when(response.getOutputStream()).thenReturn(mock(ServletOutputStream.class));

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-10
          • 1970-01-01
          相关资源
          最近更新 更多