首页 | 互联网 | IT动态 | Cisco | Windows | Linux | Java | .Net | Oracle | 华为 | 存储世界 | 服务器 | 网络设备 | IDC | 安全 | 求职招聘
IT培训 | 数字网校 | 技术专题 | 电子书下载 | 教学视频 | 网页设计 | 平面设计 | 解决方案 | 直播室 | 虚拟考场 | 搜索 | 博客 | 沙龙 | 论坛
中国IT实验室Linux频道
中国IT教育
 
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> J2EE >> JDBC/JDO >> 文章正文

利用 easymock 测试 jdbc 分析

文章来源爬虫工作室 作者佚名 更新时间2007-3-22 保存本文保存本文 推荐给好友推荐给好友 收藏本页收藏本页
    虽然以前用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会把记录的操作跟你实际的代码进行比较,如果里面出了什么差错,那么不好意思你的代码有问题,请修正后再测试。

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

    比如如果您
    conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}");
    修改为
    conn.prepareCall("{call LUCK_LOAD_COMMON(?,?,?)}");
    则出现的异常是:
    junit.framework.AssertionFailedError:
    Unexpected method call prepareCall("{call LUCK_LOAD_COMMON(?,?)}"):
    prepareCall("{call LUCK_LOAD_COMMON(?,?)}"): expected: 0, actual: 1
    prepareCall("{call LUCK_LOAD_COMMON(?,?,?)}"): expected: 1, actual: 0

  • 【责编:Peng】

    中国IT教育

    相关产品和培训
    文章评论
     友情推荐链接
     认证培训
     专题推荐

     ·超前体验 Oracle 11g的5个新特性
     ·揭密使用VB.NET的五个实用技巧
     ·Oracle和SQL Server常用函数对比专题
     ·展现C#世界 C#程序设计专题
     ·Java入门 Tomcat的配置技巧精华专题
     ·Oracle RMAN物理备份技术详解
     ·JAVA开发利器——JBuilder知多少
     ·Hello,web2.0技术进阶专题
     ·从入门到精通 java初学者实践系列教程
     ·JAVA 与 .NET两强对垒 到底该选什么?
     今日更新
     社区讨论
     博客论点
     频道精选
     Java 频道导航