【发布时间】: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