`

写了个Servlet的测试用例,初学单元测试,大家帮我看看。

    博客分类:
  • Java
阅读更多
用的JUnit是4.4版,EasyMock2.3。

这是Servlet:
package net.javayuan.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @(#)LoginServlet.java 2008-6-4 下午11:39:05
 * 
 * @author Yuan
 * LoginServlet
 */
public class LoginServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7068817837964223972L;

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response)
	throws IOException,ServletException{
		String username = request.getParameter("username").trim();
		String password = request.getParameter("password");
		if ("yuan".equals(username) && "123456".equals(password))
			response.sendRedirect("welcome.jsp");
		else
			response.sendRedirect("error.jsp");
	}
}


这是Test Case:
package net.javayuan.servlet;

import static org.easymock.EasyMock.*;

import java.io.IOException;

import org.junit.Test;
import org.junit.After;
import org.junit.Before;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @(#)LoginServlet.java 2008-6-5 上午09:19:42
 * 
 * @author Yuan
 * LoginServlet Test Case
 */
public class LoginServletTest {

	private LoginServlet servlet;
	private HttpServletRequest mockRequest;
	private HttpServletResponse mockResponse;
	
	@Before
	public void setUp(){
		
		servlet = new LoginServlet();
		
		//创建request和response的Mock
		mockRequest = createMock(HttpServletRequest.class);
		mockResponse = createMock(HttpServletResponse.class);
	}
	
	@After
	public void tearDown(){
		
		//为了验证指定的调用行为确实发生了,要调用verify(mock)进行验证。
		verify(mockRequest);
		verify(mockResponse);
	}

	/**
	 * 测试doPost方法
	 * @throws IOException
	 * @throws ServletException
	 * */
	@Test
	public void testDoPost() throws IOException, ServletException{
		
		//录制request和response的动作
		mockRequest.getParameter("username");
		expectLastCall().andReturn("yuan");//设置前一方法被调用时的返回值
		
		mockRequest.getParameter("password");
		expectLastCall().andReturn("123456");
		
		mockResponse.sendRedirect("welcome.jsp");
		
		//回放
		replay(mockRequest);
		replay(mockResponse);
		
		//开始测试Servlet的doPost方法
		servlet.doPost(mockRequest, mockResponse);
	}
	
}


不知道测试重定向的页面是不是这么测,我想应该是的。
分享到:
评论
2 楼 happy250go 2008-11-11  
工作原理不太明白啊,没用过~~~
1 楼 yuan 2008-06-18  
今天重新写了一遍测试代码,Servlet代码不变:
package net.javayuan.servlet;

import static org.easymock.EasyMock.*;

import java.io.IOException;

import org.junit.Test;
import org.junit.After;
import org.junit.Before;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @(#)LoginServlet.java 2008-6-5 上午09:19:42
 * 
 * @author Yuan
 * LoginServlet Test Case
 */
public class LoginServletTest {

	private LoginServlet servlet;
	private HttpServletRequest mockRequest;
	private HttpServletResponse mockResponse;
	
	@Before
	public void setUp(){
		
		servlet = new LoginServlet();
		
		//创建request和response的Mock
		mockRequest = createMock(HttpServletRequest.class);
		mockResponse = createMock(HttpServletResponse.class);
	}
	
	@After
	public void tearDown(){
		
		//为了验证指定的调用行为确实发生了,要调用verify(mock)进行验证。
		verify(mockRequest);
		verify(mockResponse);
	}

	/**
	 * 测试登录成功
	 * @throws IOException
	 * @throws ServletException
	 * */
	@Test
	public void testLoginSuccessful() throws IOException, ServletException{
		recordUsername("qq7338367");
		recordPassword("123456");
		
		mockResponse.sendRedirect("welcome.jsp");
		replayLogin();
	}
	
	/**
	 * 测试密码错误
	 * @throws IOException
	 * @throws ServletException
	 */
	@Test
	public void testWrongPassword() throws IOException, ServletException{
		recordUsername("qq7338367");
		recordPassword("******");
		
		mockResponse.sendRedirect("error.jsp");
		replayLogin();
	}
	
	/**
	 * 测试用户名不存在
	 * @throws IOException
	 * @throws ServletException
	 */
	@Test
	public void testUsernameNotExist() throws IOException, ServletException{
		recordUsername("yuan");
		recordPassword("123456");
		
		mockResponse.sendRedirect("error.jsp");
		replayLogin();
	}
	
	/**
	 * 录制用户名
	 * @param username 用户名
	 */
	private void recordUsername(String username){
		//录制request和response的动作
		mockRequest.getParameter("username");
		expectLastCall().andReturn(username);//设置前一方法被调用时的返回值
	}
	
	/**
	 * 录制密码
	 * @param password 密码
	 */
	private void recordPassword(String password){
		mockRequest.getParameter("password");
		expectLastCall().andReturn(password);
	}
	
	/**
	 * 回放
	 * @throws IOException
	 * @throws ServletException
	 */
	private void replayLogin() throws IOException, ServletException{

		//回放
		replay(mockRequest);
		replay(mockResponse);
		
		//开始测试Servlet的doPost方法
		servlet.doPost(mockRequest, mockResponse);
	}
}

还有哪里有待改进?希望大家能提提意见,谢谢了!

相关推荐

    韩顺平servlet部分视频教程代码+工具

    5. **测试用例**:如果有的话,可能会有测试类,用于验证Servlet功能的正确性。 **Servlet基础知识**: - **Servlet生命周期**:Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。 - **Servlet API**:`...

    StrutsTestCase-2.1.4(含文档、源码、官方示例).rar

    StrutsTestCase是Apache Struts框架的一个扩展,它提供了一种集成测试工具,使得开发者能够方便地对基于Struts的应用程序进行单元测试和功能测试。这个压缩包“StrutsTestCase-2.1.4(含文档、源码、官方示例).rar...

    会员商城初学者学习代码

    【标题】"会员商城初学者学习代码"是一个适合新手的Java系统项目,旨在帮助初学者理解和实践电商系统的基本开发流程。这个项目的核心是提供一个易于理解的代码库,让学习者能够快速上手并深入掌握Java编程语言以及...

    fire:使用Servlet+JDBC+JavaBean+Junit等写一个包含CRUD的DEMO

    通过学习这个DEMO,你可以深入理解Servlet生命周期、JDBC操作数据库的步骤、JavaBean如何封装数据以及如何编写单元测试保障代码质量。同时,这也是一个良好的起点,可以在此基础上扩展出更复杂的业务逻辑和功能。

    java 课件(初学者必看)

    12. **单元测试和持续集成**:JUnit是Java的单元测试框架,通过编写测试用例来验证代码功能。持续集成工具(如Jenkins)能自动化构建和测试过程,确保代码质量。 总之,学习Java需要逐步掌握这些基础知识,并通过...

    一些java的源程序

    Java是一种广泛使用的面向...通过这些文件名,我们可以推测压缩包包含了一系列基础到进阶的Java编程示例,涵盖了面向对象编程、输入输出、测试、并发、网络和Web开发等多个方面,对初学者来说是非常宝贵的学习资源。

    黑马java开发神器

    8. **测试用例**:JUnit或其他测试框架的测试用例,帮助验证代码功能并指导单元测试。 9. **实例应用**:可能包含一个完整的Web应用,演示了从用户登录、权限控制到数据展示等功能,供学习者参考和实践。 这个资源...

    黑马旅游网JAVAWEB版

    6. **测试**:理解单元测试的重要性,学习如何编写和运行JUnit测试用例。 通过对这个项目的学习,你可以系统地提升Java Web开发能力,掌握完整的项目开发流程,从需求分析、设计、编码到测试和部署。这将对你的职业...

    javaweb当当网源码

    6. **单元测试和集成测试**:良好的项目应该包含测试代码,如JUnit测试用例,以确保各个模块的功能正确无误。 7. **部署和容器**:项目可能使用Tomcat或Jetty这样的Java应用服务器进行部署,也可能涉及Docker容器化...

    java开发常见的查询帮助文档

    Junit标签提示了还包含了单元测试的相关知识,JUnit是Java中最常用的单元测试框架,它使得编写和执行测试用例变得简单,是保证代码质量的重要工具。 总的来说,这个压缩包是一个丰富的学习资源,无论是初学者还是...

    毕业设计源码之2048小游戏.zip

    7. **单元测试**:为了确保代码质量,项目可能包含了JUnit或其他测试框架编写的测试用例。 通过研究这个项目,无论是初学者还是经验丰富的开发者,都能从中获得宝贵的学习经验和实践机会。无论是理解游戏算法,还是...

    商场管理系统

    9. **单元测试和集成测试**:JUnit和Mockito等工具可能用于编写测试用例,确保代码质量和系统功能的正确性。 10. **文档编写**:包括需求规格书、设计文档、用户手册等,帮助理解系统功能和操作流程。 通过深入...

    网上购物系统

    对于初学者或者开发者来说,这是一个很好的实践机会,可以通过解决实际问题来提升自己的技能。 从【压缩包子文件的文件名称列表】"第一组-网上购物系统的设计与实现"来看,我们可以期待一系列有关系统设计和实现的...

    javaweb 人员管理信息项目Card.rar

    【描述】"可以看看项目 javaweb项目"提示我们这个项目是JavaWeb开发的一个实例,旨在提供学习和参考。JavaWeb是一种广泛应用于构建动态网站和企业级应用的技术,它结合了Java编程语言、Servlets、JSP(JavaServer ...

    apache-cxf-3.0.13

    在了解这个版本之前,我们先来看看Apache CXF的基本概念和功能。 Apache CXF是一个全面的Web服务框架,它支持多种协议和标准,如WS-*(包括WS-Security、WS-ReliableMessaging等)、RESTful服务以及JAX-RS和JAX-WS...

    留言板jsp代码

    7. **测试用例或示例数据**:如果提供,可能有`test.jsp`或`sampleData.sql`,用于演示留言板功能或填充初始的测试数据。 学习和理解这样一个留言板JSP代码,开发者可以了解到如何在JSP中处理表单提交、如何与...

    基于java的记账系统毕业设计(源代码+数据库+部署文档+部署视频).zip

    9. **测试**:项目可能包含单元测试和集成测试,确保代码的质量和功能的正确性。JUnit和Mockito等工具可能被用来编写和执行测试用例。 10. **设计模式**:项目中可能会应用到多种设计模式,如工厂模式、单例模式、...

    java学士后第一单元项目 北大青鸟音乐共享平台源代码

    8. **单元测试**:为了确保代码质量,项目可能包含了JUnit或其他测试框架的测试用例,用于验证各个模块的功能。 在学习这个项目时,应重点理解以下几个知识点: - **Java基础**:包括类、对象、继承、封装、多态等...

    JavaWeb-ch7-code.rar

    标签"JavaWeb 实验报告"进一步确认了这是一个实践性质的学习材料,可能包括实际的代码示例、测试用例以及运行结果的解释。实验报告通常包含对实现功能的详细说明,步骤解析,可能遇到的问题及解决方案,这对于初学者...

    方立勋web.doc

    通过JUnit,开发者可以为代码编写测试用例,确保功能正确性,并在修改代码后重新运行测试,以检测潜在的问题。 ### Java5的新特性 #### 静态导入 静态导入允许直接使用类的静态成员,无需前缀,提高了代码的可读性...

Global site tag (gtag.js) - Google Analytics