当前位置: 首页 > 工具软件 > Cactus > 使用案例 >

cactus java_Cactus入门

章稳
2023-12-01

这是一个WebProject,有关Cactus用法详见本文测试用例

首先是web.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

ServletTestRedirector

org.apache.cactus.server.ServletTestRedirector

ServletTestRedirector

/ServletRedirector

下面是待测试的LoginServlet.java

package com.jadyer.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

private static final long serialVersionUID = 6655227641354075528L;

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

PrintWriter out = response.getWriter();

out.println("

usernamepassword
");

out.flush();

out.close();

}

public boolean login(HttpServletRequest request){

String loginUser = (String)request.getSession().getAttribute("loginUser");

if(null==loginUser || !"http://blog.csdn.net/jadyer".equals(loginUser)){

System.out.println("用户[" + loginUser + "]登录失败");

return false;

}

System.out.println("用户[" + loginUser + "]登录成功");

return true;

}

}

下面是Cactus运行时要用到的,位于test SourceFolder下面的cactus.properties

#键名固定,键值模式为http://localhost:port/contextRoot/(是否以斜线结尾均可,但这里的端口要与Web服务器的启动端口一致)

cactus.contextURL=http://127.0.0.1:8088/Cactus_demo/

最后是使用Cactus编写的位于test SourceFolder下的测试用例LoginServletTest.java

package com.jadyer.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import junit.framework.Assert;

import org.apache.cactus.ServletTestCase;

import org.apache.cactus.WebRequest;

import org.xml.sax.SAXException;

import com.meterware.httpunit.WebResponse;

/**

* @see ----------------------------------------------------------------------------------------------------

* @see Cactus简介

* @see Cactus可以模拟JavaEE容器进行测试JSP、Servlet、Filter和EJB等

* @see Cactus不支持JUnit4中的annotation,它主要是基于JUnit3.8进行操作的

* @see Cactus下载地址为http://archive.apache.org/dist/jakarta/cactus/

* @see ----------------------------------------------------------------------------------------------------

* @see Cactus工作流程(分为ClientSide和ServerSide)

* @see ClientSide中包括beginXxx()和endXxx()方法,ServerSide中包括setUp()和testXxx()和tearDown()等方法

* @see 执行顺序为beginXxx->setUp->testXxx->tearDown->endXxx->beginYyy->setUp->testYyy->tearDown->endYyy

* @see 可以粗略的将beginXxx和endXxx方法理解为JUnit4中的@BeforeClass和@AfterClass,尽管它们俩之间并没有什么联系

* @see 注意:这里beginXxx和testXxx方法中的Xxx要是一样的,如beginLogin()和testLogin(),如此这俩方法才能对应上

* @see ----------------------------------------------------------------------------------------------------

* @see Cactus编写方法

* @see 1)引入它所依赖的基础jar

* @see aspectjrt-1.5.3.jar

* @see cactus.core.framework.uberjar.javaEE.14-1.8.1.jar

* @see cactus.integration.ant-1.8.1.jar

* @see cactus.integration.shared.api-1.8.1.jar

* @see commons-codec-1.6.jar(需单独下载)

* @see commons-discovery-0.4.jar

* @see commons-httpclient-3.1.jar

* @see commons-logging-1.1.jar

* @see geronimo-j2ee-management_1.0_spec-1.1.jar

* @see httpunit-1.6.jar

* @see Tidy.jar或者nekoHTML.jar和xercesMinimal.jar(本例中的endDoGet()方法要用到)

* @see (nekoHTML的下载地址为http://sourceforge.net/projects/nekohtml/files/)

* @see (其中nekoHTML.jar和xercesMinimal.jar均可从下载到的nekohtml-1.9.18.zip找到,Tidy.jar想用的话也要单独下载)

* @see 2)classpath下编写一个名为cactus.properties的文件,文件内容如下

* @see #键名固定,键值模式为http://localhost:port/contextRoot/(是否以斜线结尾均可,但这里的端口要与Web服务器的启动端口一致)

* @see cactus.contextURL=http://127.0.0.1:8088/Cactus_demo/

* @see 3)在web.xml中配置org.apache.cactus.server.ServletTestRedirector映射,固定为"/ServletRedirector"

* @see 4)编写一个继承了org.apache.cactus.ServletTestCase的类(它内部间接继承了junit.framework.TestCase)

* @see 这样此类便自动拥有了ServletAPI引用,比如要使用HttpSession就可以直接session.setAttribute()

* @see ----------------------------------------------------------------------------------------------------

* @see 就本例而言,它的缺点是每一次测试Servlet时都要启动Tomcat

* @see 如果不想每次都启动Web服务器,那么可以考虑使用嵌入式服务器,目前最好用的嵌入式服务器也是最火的就是Jetty

* @see 关于Jetty的简单用法,可参考我的博文http://blog.csdn.net/jadyer/article/details/9299485

* @see ----------------------------------------------------------------------------------------------------

* @create Jul 4, 2013 7:21:09 PM

* @author 玄玉

*/

public class LoginServletTest extends ServletTestCase {

private LoginServlet loginServlet;

//它是在ServerSide执行的

public void setUp(){

loginServlet = new LoginServlet();

}

//beginXxx()方法是在ClientSide执行的

//如果想在testLogin()中获取到这里request添加的username参数,那么这个方法就应该命名为beginLogin()

public void beginLogin(WebRequest request){

request.addParameter("username", "Jadyer");

}

//它是在ServerSide执行的

public void testLogin(){

//获取GET参数

Assert.assertEquals(request.getParameter("username"), "Jadyer");

//登录失败

//session.setAttribute("loginUser", "玄玉");

Assert.assertFalse(loginServlet.login(request));

//登录成功

session.setAttribute("loginUser", "http://blog.csdn.net/jadyer");

Assert.assertTrue(loginServlet.login(request));

}

//它是在ServerSide执行的

public void testDoGet() throws ServletException, IOException {

loginServlet.doGet(request, response);

}

//endXxx()方法是在ClientSide执行的,该方法对应testDoGet()

public void endDoGet(WebResponse resp) throws SAXException {

//这里使用com.meterware.httpunit.WebResponse,而非org.apache.cactus.WebResponse,前者提供了很多增强功能

//但在使用httpunit中的WebResponse时,要额外借助Tidy.jar或者nekoHTML.jar和xercesMinimal.jar作为辅助包

Assert.assertEquals(resp.getTables()[0].getCellAsText(0,0), "username");

Assert.assertEquals(resp.getTables()[0].getCellAsText(0,1), "password");

}

}

 类似资料: