转: EasyMock与Junit的集成测试

上一篇 / 下一篇  2014-03-24 10:24:14 / 个人分类:Junit

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生成数据库连接简单测试示例 

Java代码 复制代码
  1. package demo.mock;   
  2.   
  3. import java.sql.Connection;   
  4. import java.sql.PreparedStatement;   
  5. import java.sql.ResultSet;   
  6. import java.sql.SQLException;   
  7.   
  8.   
  9. public class LoginAction{   
  10.        
  11.     public String login(Connection conn, String name, int pas) {   
  12.            
  13.         PreparedStatement pst = null;   
  14.         ResultSet rs = null;   
  15.            
  16.         try {   
  17.             String sql = "select * from user where name = ? and pas = ?";   
  18.             pst = conn.prepareStatement(sql);   
  19.             pst.setString(1, name);   
  20.             pst.setInt(2, pas);   
  21.             rs = pst.executeQuery();   
  22.                
  23.             if(rs.next()) {   
  24.                 return "登陆成功。";   
  25.             } else {   
  26.                 return "登陆失败。";   
  27.             }   
  28.                
  29.         }catch(SQLException e) {   
  30.             e.printStackTrace();   
  31.             return "抛出异常。";   
  32.         } finally {        
  33.             try {   
  34.                 rs.close();   
  35.                 pst.close();   
  36.             } catch (SQLException e) {   
  37.                 e.printStackTrace();   
  38.             }   
  39.         }   
  40.     }   
  41.   
  42. }   
  43.   
  44.   
  45. package demo.mock;   
  46.   
  47. import static org.easymock.EasyMock.createControl;   
  48. import static org.easymock.EasyMock.expect;   
  49. import static org.junit.Assert.assertEquals;   
  50.   
  51. import java.sql.Connection;   
  52. import java.sql.PreparedStatement;   
  53. import java.sql.ResultSet;   
  54. import java.sql.SQLException;   
  55.   
  56. import org.easymock.IMocksControl;   
  57. import org.junit.After;   
  58. import org.junit.Before;   
  59. import org.junit.Test;   
  60.   
  61. public class LoginActionTest {   
  62.        
  63.     private LoginAction login;   
  64.        
  65.     @Before  
  66.     public void init() {   
  67.         login = new LoginAction();   
  68.     }   
  69.        
  70.     @After  
  71.     public void destory() {   
  72.         login = null;   
  73.     }   
  74.   
  75.     @Test  
  76.     public void login() throws SQLException{   
  77.         String name = "admin";   
  78.         int pas = 123;   
  79.            
  80.         //创建Mock对象   
  81.         IMocksControl control = createControl(); //创建多个Mock对象时通过IMocksControl管理   
  82.   
  83.         Connection conn = control.createMock(Connection.class);   
  84.         PreparedStatement pst = control.createMock(PreparedStatement.class);   
  85.         ResultSet rs = control.createMock(ResultSet.class);   
  86.   

TAG:

 

评分:0

我来说两句

Open Toolbar