这是一个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("

username password

");

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");

}

}

cactus java_Cactus入门相关推荐

  1. 微信二维码支付快速入门

    目录 一.二维码生成插件qrious 二.HttpClient 三.微信扫码支付 1.申请步骤 2.开发文档 四.入门Demo 1.工程搭建 2.myStudy-pay-interface 3.myS ...

  2. Android学习笔记---HttpClient入门,使用方法,及简介

    HttpClient入门 发华 金, 软件工程师,IBM CSDL, EMC 金发华是一名工作在 IBM CSDL 的软件工程师.他喜欢钻研各种新的技术,在 Java 网络开发和 Web 开发方面颇有 ...

  3. 腾讯云Coding平台入门指引

    目录 Coding devops 登录coding 创建项目 邀请成员 创建代码仓库 新建制品库 docker仓库 maven仓库 npm制品库 持续集成 内建环境变量 Java基础镜像制作 创建持续 ...

  4. BZOJ1023[SHOI2008]cactus仙人掌图 【仙人掌DP】

    题目 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌 图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说 ...

  5. 掌握Tiles 框架 (一)---Tiles入门和Tiles 框架和体系结构

    入门 本教程所讲述的内容 本教程讲述如何使用 Tiles 框架来创建可重用的表示组件.(在最初创建它时,Tiles 框架被命名为 Components. 后来改变了名称是因为"compone ...

  6. 从零开始入门创作游戏——对象交互与UI展示

    做教程远比自己开发游戏要花时间...继续写小恐龙的游戏教程 环境搭建在这里 从零开始入门创作游戏--Unity3d的环境搭建_默哀d的博客-CSDN博客 素材导入和基本页面介绍在这里 从零开始入门创作 ...

  7. HttpClient入门教程

    HttpClient简介 HttpClient 功能介绍     1. 读取网页(HTTP/HTTPS)内容     2.使用POST方式提交数据(httpClient3)      3. 处理页面重 ...

  8. 用Construct 2制作入门小游戏~

    今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...

  9. Docker入门六部曲——Swarm

    原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...

最新文章

  1. capslock键英语怎么读_刚开始读英文原版书该怎么做?商务英语专业有前途吗?...
  2. '固定' table宽度,走起!
  3. 什么端口可以抓LINUX,linux下开启某个端口的方法:可用于SQL
  4. Python基础(二)--数据类型,运算符与流程控制
  5. webpack4+vue打包简单入门
  6. python之使用request模块发送post和get请求
  7. CSS/HTML/JS实现图片轮播
  8. 【生信进阶练习1000days】day3-Bioconductor annotation resources
  9. protel常用元件封装大全
  10. 真正的落雷(打印图形练习题)C语言
  11. eclipse启动报错,显示找不到指定路径的JRE
  12. rocketmq获取消息id_贞炸了!上线之后,消息收不到了!
  13. python 编写 cgi 脚本
  14. 阿里云安装Jdk1.8,So easy!
  15. [redis]Redis ZSet排序问题(排名实现按时间顺序排布)
  16. 分类与评估模型(一)
  17. iOS 视频直播技术
  18. 解决谷歌浏览器跨域以及cookie保存失效重复登录
  19. H5监听摇一摇和手机倾斜事件(重力感应)
  20. 【历史上的今天】12 月 28 日:冯·诺伊曼诞生;林纳斯·托瓦兹出生;CSDN 正式上线

热门文章

  1. 8255工作方式一选通输入——A口(含时序图分析)
  2. 计算机课有什么作业,计算机组成原理课堂作业
  3. Django 系列博客(十一)
  4. 常见爬虫/BOT对抗技术介绍(一)
  5. MPEG-2码流结构分析
  6. javaScript = == ===的区别
  7. HDU 3420 Bus Fair [补]
  8. 使用C#开发纽曼USB来电小秘书客户端小结
  9. Git命令行介绍和使用说明(持续更新)
  10. 数据库表多维度数据的计算和汇总