Cactus使用
前言:本文章需要JUnit单元测试框架的基础知识,若读者还不具备,请阅读笔者的JUnit文章:http://ray-yui.iteye.com/blog/1914106
UnitTest系列文章:
使用JUnit开发单元测试:http://ray-yui.iteye.com/blog/1914106
使用DBUnit扩展JUnit:http://ray-yui.iteye.com/blog/1914979
使用EasyMock扩展Junithttp://ray-yui.iteye.com/blog/1916170
什么是Cactus?
Cactus是Apache下的一个开源测试Web层的框架,可以完成模拟J2EE的容器来进行测试,可以测试Servlet,JSP,Filter,EJB等等,以下图片为Cactus官方网站的原理图
为什么要使用Cactus?
当测试DAO时我们可以使用DBUnit来进行对数据库的隔离,当我们测试Service的时候可以使用EasyMock来模拟DAO的实现进行Service和DAO的隔离,虽然我们测试Servlet的时候也可以使用EasyMock来对Session,Request等来进行模拟,但实际上我们会发现,使用Mock来模拟Servlet只能测试简单的Servlet,例如Session,Request,Parameter等,对一些Servlet的返回值,返回了什么View等,测试起来还是力不从心,使用Cactus可以产生模拟的容器来对Servlet进行测试,大大减低了测试难度和提高了测试效率
Cactus使用:
增加Maven依赖
<dependency><groupId>httpunit</groupId><artifactId>httpunit</artifactId><version>1.7</version></dependency><dependency><groupId>org.apache.cactus</groupId><artifactId>cactus.core.framework.uberjar.javaEE.15</artifactId><version>1.8.1</version></dependency>
cactus.contextURL=http://localhost:8080/test
package com.accentrix.ray.test.unit;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.accentrix.ray.entity.User;public class LoginServlet extends HttpServlet {/** * */private static final long serialVersionUID = 6916692964267082204L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String userName = req.getParameter("username");if (userName == null || "".equals(userName.trim()))resp.sendRedirect("/error.jsp");elsereq.getRequestDispatcher("/success.jsp").forward(req, resp);}}
package com.accentrix.ray.test.unit;import java.io.IOException;import javax.servlet.ServletException;import org.apache.cactus.ServletTestCase;import org.apache.cactus.WebRequest;import org.xml.sax.SAXException;import com.meterware.httpunit.WebResponse;public class TestLoginServlet extends ServletTestCase {private LoginServlet loginServlet;/* * 由begin开始的方法,都被视为客户端方法,这里的操作 都应该是从 * 客户端发出的,例如客户端传递给服务端的参数就应该从begin方法 * 中传入,参数WebRequest为生成request而需要 */public void beginLogin(WebRequest request) {// 通过request.addParameter()来添加parameterrequest.addParameter("username", "Ray");}/* * 初始化对象 */public void setUp() {loginServlet = new LoginServlet();}/* * 测试doGet方法 */public void testDoGet() throws ServletException, IOException {// 注意,此时request和response为ServletTestCase的属性loginServlet.doGet(super.request, super.response);}/* * 由end开始的方法,都被视为服务器响应方法,这里操作 * 的应该是验证服务器传回来的结果,例如返回的JSP是否正确 * ,参数WebResponse为验证提供了大量的方法,例如getTable */public void endDoGet(WebResponse response) throws SAXException {//返回已编译后的html页面的titleassertEquals("test", response.getTitle());//返回整个html的documentassertEquals("test", response.getDOM().getElementById("Ray").getNodeValue());//返回指定名称的元素assertEquals(3, response.getElementsByTagName("input").length);}}