`
石建武
  • 浏览: 74941 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

测试工作(3 -- EasyMock与Junit4学习整理)

阅读更多

EasyMock与Junit的集成测试

EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,比如HttpServletRequest、Connection等,从而把测试与测试边界以外的对象隔离开,真正的形成“单元测试”,而不会因为依赖对象对测试产生影响。

1、使用EasyMock的大体步骤

A.使用 EasyMock 生成 Mock 对象;
单个的Mock对象,利用静态导入EasyMock,通过createMock(interfaceName.class)
多个Mock对象,通过ImocksControl管理。
IMocksControl control = EasyMock.createControl();
java.sql.Connection mockConnection = control.createMock(Connection.class);
java.sql.Statement mockStatement = control.createMock(Statement.class);

B.设定 Mock 对象的预期行为和输出; 比如一个PreparedStatement的Mock对象pst
expect(pst.executeQuery()).andReturn(rs);
pst.close();
所有实际代码执行的方法,都必须“录制”。

 



D. 将 Mock 对象切换到 Replay 状态
单个Mock:replay(mockObj)
多个Mcok:control.replay()

E.利用 Mock 对象方法进行实际单元测试;
String res = login.login(conn, name, pas); //con是一个Connection的Mock对象
F.对 Mock 对象的行为进行验证。
单个Mock:verify(mockObj) 
多个Mock:control.verify()


附:利用EasyMock生成数据库连接简单测试示例

package demo.mock;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class LoginAction{
	
	public String login(Connection conn, String name, int pas) {
		
		PreparedStatement pst = null;
		ResultSet rs = null;
		
		try {
			String sql = "select * from user where name = ? and pas = ?";
			pst = conn.prepareStatement(sql);
			pst.setString(1, name);
			pst.setInt(2, pas);
			rs = pst.executeQuery();
			
			if(rs.next()) {
				return "登陆成功。";
			} else {
				return "登陆失败。";
			}
			
		}catch(SQLException e) {
			e.printStackTrace();
			return "抛出异常。";
		} finally {		
			try {
				rs.close();
				pst.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

}


package demo.mock;

import static org.easymock.EasyMock.createControl;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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

public class LoginActionTest {
	
	private LoginAction login;
	
	@Before
	public void init() {
		login = new LoginAction();
	}
	
	@After
	public void destory() {
		login = null;
	}

	@Test
	public void login() throws SQLException{
		String name = "admin";
		int pas = 123;
		
		//创建Mock对象
		IMocksControl control = createControl(); //创建多个Mock对象时通过IMocksControl管理

		Connection conn = control.createMock(Connection.class);
		PreparedStatement pst = control.createMock(PreparedStatement.class);
		ResultSet rs = control.createMock(ResultSet.class);

		// 录制信息,即设定Mock对象的预期行为和输出
		// 所有Mock对象需要执行的方法都必须录制,如pst.setInt(2, pas)、rs.close()等
		String sql = "select * from user where name = ? and pas = ?";
		expect(conn.prepareStatement(sql)).andReturn(pst).times(1);	 
		
		pst.setString(1, name);
		pst.setInt(2, pas);
		
		expect(pst.executeQuery()).andReturn(rs);
		expect(rs.next()).andReturn(true);
		
		
		rs.close();
		pst.close();
		
		//录制完成,切换replay状态
		control.replay();
		
		//调用实际的方法
		String res = login.login(conn, name, pas);
		String expected = "登陆成功。";
		assertEquals(expected, res);
		
		//验证
		control.verify();
	
	}

}





2、重要的概念

在一个完整的测试过程中,一个 Mock 对象将会经历两个状态:Record 状态和 Replay 状态。Mock 对象一经创建,它的状态就被置为 Record。在 Record 状态,用户可以设定 Mock 对象的预期行为和输出,这些对象行为被录制下来,保存在 Mock 对象中。
将 Mock 对象切换到 Replay 状态
在使用 Mock 对象进行实际的测试前,我们需要将 Mock 对象的状态切换为 Replay。在 Replay 状态,Mock 对象能够根据设定对特定的方法调用作出预期的响应。将 Mock 对象切换成 Replay 状态有两种方式,您需要根据 Mock 对象的生成方式进行选择。如果 Mock 对象是通过 org.easymock.EasyMock 类提供的静态方法 createMock 生成的(第1节中介绍的第一种 Mock 对象生成方法),那么 EasyMock 类提供了相应的 replay 方法用于将 Mock 对象切换为 Replay 状态:
replay(mockResultSet);

如果 Mock 对象是通过 IMocksControl 接口提供的 createMock 方法生成的(第1节中介绍的第二种Mock对象生成方法),那么您依旧可以通过 IMocksControl 接口对它所创建的所有 Mock 对象进行切换:
control.replay();


对 Mock 对象的行为进行验证
在利用 Mock 对象进行实际的测试过程之后,我们还有一件事情没有做:对 Mock 对象的方法调用的次数进行验证。
为了验证指定的方法调用真的完成了,我们需要调用 verify 方法进行验证。和 replay 方法类似,您需要根据 Mock 对象的生成方式来选用不同的验证方式。如果 Mock 对象是由 org.easymock.EasyMock 类提供的 createMock 静态方法生成的,那么我们同样采用 EasyMock 类的静态方法 verify 进行验证:
verify(mockResultSet);

如果Mock对象是有 IMocksControl 接口所提供的 createMock 方法生成的,那么采用该接口提供的 verify 方法,例如第1节中的 IMocksControl 实例 control:
control.verify();


Mock 对象的重用
为了避免生成过多的 Mock 对象,EasyMock 允许对原有 Mock 对象进行重用。要对 Mock 对象重新初始化,我们可以采用 reset 方法。和 replay 和 verify 方法类似,EasyMock 提供了两种 reset 方式:(1)如果 Mock 对象是由 org.easymock.EasyMock 类中的静态方法 createMock 生成的,那么该 Mock 对象的可以用 EasyMock 类的静态方法 reset 重新初始化;(2)如果 Mock 方法是由 IMocksControl 实例的 createMock 方法生成的,那么该 IMocksControl 实例方法 reset 的调用将会把所有该实例创建的 Mock 对象重新初始化。
在重新初始化之后,Mock 对象的状态将被置为 Record 状态。


参考:1、http://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/(推荐)
      2、http://macrochen.iteye.com/blog/298032

 

分享到:
评论

相关推荐

    powermock-easymock-junit-1.5.4.zip

    PowerMock与EasyMock是Java单元测试领域中的两个重要库,它们与JUnit结合使用,能够帮助开发者在测试过程中模拟复杂的对象行为和系统环境。这个压缩包"powermock-easymock-junit-1.5.4.zip"很可能包含了这三个库的...

    powermock-easymock-junit-1.6.1.zip

    在"powermock-easymock-junit-1.6.1.zip"中,这些工具已经集成在一起,方便开发者同时利用PowerMock和EasyMock的能力来编写JUnit测试。 在实际应用中,我们通常会按照以下步骤进行: 1. 引入PowerMock和EasyMock的...

    5-Mock+EasyMock.rar

    7. **EasyMock与其它测试框架的结合**:EasyMock可以很好地与JUnit、TestNG等测试框架集成,提供更加丰富的测试环境。 理解并熟练使用Mock对象和EasyMock框架,能显著提升单元测试的质量,帮助开发者编写出更加健壮...

    easymock selenium junit

    3. JUnit的测试注解和断言方法,以及如何组织测试结构。 4. 如何在测试中适当地使用Easymock来隔离被测试代码。 5. 结合Selenium实现UI级别的自动化测试,验证页面渲染和用户交互。 6. 整合Easymock、Selenium和...

    EasyMock 3.1相关jar(所有)

    还在为EasyMock使用时出异常而...本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心使用!

    Junit+EasyMock单元测试使用资料以及案例分析

    Junit和EasyMock是Java领域中广泛使用的两个工具,它们协同工作,提供了强大的单元测试能力。本文将深入探讨这两个工具的使用,并通过案例分析帮助你更好地理解和应用它们。 **Junit简介** JUnit是Java编程语言中最...

    junit4 jar包

    此外,JUnit4可以与其他库(如Mockito、EasyMock等)结合使用,进行模拟对象和依赖注入,以实现更复杂的测试场景。 总结一下,"junit4 jar包"是Java开发中不可或缺的一部分,它提供了一套完善的单元测试工具和API,...

    Junit+EasyMock单元测试的jar包

    EasyMock与Junit结合使用时,可以更有效地进行测试。例如,可以先使用EasyMock创建和配置模拟对象,然后在Junit的测试方法中使用这些模拟对象。在测试完成后,可以使用EasyMock的assertions来检查模拟对象的行为是否...

    rh-java-common-easymock3-3.3-1.5.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    rh-java-common-easymock3-javadoc-3.3-1.5.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    4-EasyMock-Servlet.rar

    在“4-EasyMock-Servlet.rar”这个压缩包中,我们很可能是得到了一个关于如何使用EasyMock进行Servlet测试的教程或者示例代码。让我们详细探讨一下EasyMock与Servlet结合使用的相关知识点。 1. **EasyMock基本概念*...

    sclo-cassandra3-powermock-api-easymock-1.6.5-6.el7.noarch.rpm

    官方离线安装包,亲测可用

    转:EasyMock 单元测试

    在实践中,结合使用 EasyMock 和其他测试工具,如 JUnit 或 TestNG,可以帮助开发者构建出强大而健壮的测试套件,从而提升软件质量。记住,良好的单元测试不仅仅是找出问题,更是预防问题的发生。通过使用 EasyMock...

    rh-java-common-easymock-1.2-22.14.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    rh-java-common-easymock-javadoc-1.2-22.14.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    rh-maven35-powermock-api-easymock-1.6.5-5.3.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    rh-maven35-powermock-api-easymock-1.6.5-5.2.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    rh-java-common-easymock2-2.5.2-12.15.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    rh-java-common-easymock2-javadoc-2.5.2-12.15.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    EasyMock入门

    在提供的`easymock.rar`和`easymock-3.0.zip`文件中,可能包含了EasyMock的库文件和相关的示例代码。你可以解压并导入到你的项目中,参考示例来学习和使用EasyMock。在实际应用中,结合IDE(如Eclipse或IntelliJ ...

Global site tag (gtag.js) - Google Analytics