【问题标题】:Servlet JUnit test using Jmockit使用 Jmockit 进行 Servlet JUnit 测试
【发布时间】:2015-10-19 19:13:46
【问题描述】:

我想使用 JUnit 和 JMockit 为 Servlet 构建一个单元测试。

我有一个 ImageServlet,它将图像 ID(字符串)作为请求参数,如果 ID 为 null,则 servlet 会抛出 HTTP 状态代码 404(未找到) 对于这种情况,我进行了测试:

单元测试:

@RunWith(JMockit.class)
public class ImageServletTest {

    @Tested
    private ImageServlet servlet;

    @Injectable
    HttpServletRequest mockHttpServletRequest;  

    @Injectable
    HttpServletResponse mockHttpServletResponse;

    @Injectable
    PrintWriter printWriter;

    @Injectable
    ServletOutputStream servletOutputStream;

    @Before 
    public void setUp() throws Exception {
        servlet = new ImageServlet();
        initMocks(null); 
    }

    private void initMocks(final String imgId) throws Exception {
        new NonStrictExpectations() {{                                      
            mockHttpServletRequest.getParameter("id");
            result = imgId;

            mockHttpServletResponse.getWriter();
            result = printWriter;

            mockHttpServletResponse.getOutputStream();
            result = servletOutputStream;
        }};
    }

    @Test
    public void testImageNotFound() throws Exception {        
        servlet.doGet(mockHttpServletRequest, mockHttpServletResponse);
        org.junit.Assert.assertTrue(mockHttpServletResponse.getStatus() == HttpServletResponse.SC_NOT_FOUND);
    }

}

问题是我的断言失败,因为 mockHttpServletResponse.getStatus() 总是返回 0,有没有办法使用 JMockit 获取 servlet 的结果状态码?

【问题讨论】:

  • Servlet 和 EJB 不适合进行单元测试。最好重构为 POJO 并将应用服务器/servlet 引擎排除在外。
  • @duffymo:好点。可测试性设计通常不会测试服务器实现级别的“边界”。 Jakob Jenkov 对此做了博文。但是,当您必须这样做时,servlet API 模拟库、模拟框架、javassist 等允许您在没有实际服务器的情况下执行此操作。

标签: java unit-testing servlets junit jmockit


【解决方案1】:

我不熟悉所有最新的 JMockit 注入东西,所以我使用了 JMockit 对“假货”的支持。

@RunWith(JMockit.class)
public class ImageServletTest3 {

     @Test
    public void testImageNotFound() throws Exception {
        ImageServlet servlet = new ImageServlet();

        servlet.doGet(
            new MockUp<HttpServletRequest>() {
              @Mock
              public String getParameter(String id){
                return null;
              }

            }.getMockInstance(),
            new MockUp<HttpServletResponse>() {
              @Mock
              public void sendError(int num){
                Assert.assertThat(num, IsEqual.equalTo(404));               
              }             
            }.getMockInstance()
       );
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2023-04-11
    • 2014-05-28
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多