路是爬出来的

用easymock测试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会把记录的操作跟你实际的代码进行比较,如果里面出了什么差错,那么不好意思你的代码有问题,请修正后再测试。



    如果有兴趣可以自己试下。

    posted on 2006-12-30 09:06 路是爬出来的 阅读(180) 评论(0)  编辑  收藏


    只有注册用户登录后才能发表评论。


    网站导航: