WEB开发网
开发学院WEB开发Jsp 利用 easymock 测试 jdbc 分析 阅读

利用 easymock 测试 jdbc 分析

 2008-01-05 08:23:41 来源:WEB开发网   
核心提示: 虽然以前用easymock测试过Dao,但那些Dao的实现,利用 easymock 测试 jdbc 分析,要么就hibernate,要么就用sPRing,那么不好意思你的代码有问题,请修正后再测试,而这两个框架的执行正确与否我们是不用关心的,JDBC是不是也这样测试了
   虽然以前用easymock测试过Dao,但那些Dao的实现,要么就hibernate,要么就用sPRing,而这两个框架的执行正确与否我们是不用关心的。JDBC是不是也这样测试了。答案是肯定的。
    这几天要用存储过程跟jdbc来做个项目,想想也有好长一段时间没用过JDBC来做项目了。该复习复习了。
    前阵子学了easymock,真好现在可以派上用场了。不过在测试的过程中还是碰到了不小问题,想来是自己基础不好的缘故。

    这次不TDD了,太麻烦了。
    先看看我们要测试的代码
    java 代码  
  1. CallableStatementcstmt = null; 
  2.     try { 
  3.       cstmt = _conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}"); 
  4.       cstmt.setString(1, "1"); 
  5.       cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); 
  6.  
  7.       cstmt.executeUpdate(); 
  8.       return cstmt.getString(2); 
  9.  
  10.     } catch (Exception e) { 
  11.       GxDebug.logException(e); 
  12.       e.printStackTrace(); 
  13.       return null; 
  14.     } finally { 
  15.       if (cstmt != null) 
  16.         try { 
  17.           cstmt.close(); 
  18.         } catch (Exception e) { 
  19.       } 
  20.     } 
  代码还挺长的。从上面的代码我们知道我们必须mock两个对象进去。一个是Connection, 一个是CallableStatementcstmt 。
好再看看我们的测试代码
java 代码
  1. conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}"); 
  2.   conControl.setReturnValue(cstmt); 
  3.   conControl.replay(); 
  4.    
  5.   cstmt.setString(1, "1"); 
  6.   cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); 
  7.   cstmt.executeUpdate(); 
  8.   cstmtControl.setReturnValue(1); 
  9.   cstmt.getString(2); 
  10.   cstmtControl.setReturnValue("5,4,3"); 
  11.   cstmt.close(); 
  12.   cstmtControl.replay(); 
  13.    
  14.    
  15.   String rusult = dao.getNumber(); 
  16.   Assert.assertEquals("5,4,3", rusult); 
  17.    
  18.   conControl.verify(); 
  19.   cstmtControl.verify(); 

oh,my got!测试代码比实现代码还要多。这段代码能执行吗?
我想可以的。easymock的原理是记录-回放的模式。
我想要做的工作是:
1,记录你mock对象的工作记录,比如上面的代码我们mock对象的工作记录是:
java 代码
  1. conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}"); 
  2.     conControl.setReturnValue(cstmt); 
  3.     cstmt.setString(1, "1"); 
  4.     cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); 
  5.     cstmt.executeUpdate(); 
  6.     cstmtControl.setReturnValue(1); 
  7.     cstmt.getString(2); 
  8.     cstmtControl.setReturnValue("5,4,3"); 
  9.     cstmt.close(); 
  10.  

 假如你工作记录的代码要求有返回值的话,那么你必须提供一个自定义的值给它,否则会报错。比如上面的
  •  cstmt.getString(2); 
  •     cstmtControl.setReturnValue("5,4,3");  //自己定义的返回值,用作以后的比较。
    上面的是记录操作,回放的时候,easymock会把记录的操作跟你实际的代码进行比较,假如里面出了什么差错,那么不好意思你的代码有问题,请修正后再测试。

    假如有爱好可以自己试下。


  • Tags:利用 easymock

    编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接