快速业务通道

利用easymock测试jdbc分析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25

利用easymock测试jdbc分析

时间:2007-05-30 爬虫工作室

虽然以前用easymock测试过Dao,但那些Dao的实现,要么就hibernate,要么就用spring,而这两个框架的执行正确与否我们是不用关心的。JDBC是不是也这样测试了。答案是肯定的。这几天要用存储过程跟jdbc来做个项目,想想也有好长一段时间没用过JDBC来做项目了。该复习复习了。前阵子学了easymock,真好现在可以派上用场了。不过在测试的过程中还是遇到了不小问题,想来是自己基础不好的缘故。 这次不TDD了,太麻烦了。先看看我们要测试的代码

java代码

CallableStatementcstmt = null; try { cstmt = _conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}"); cstmt.setString(1, "1"); cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);

cstmt.executeUpdate(); return cstmt.getString(2);

} catch (Exception e) { GxDebug.logException(e); e.printStackTrace(); return null; } finally { if (cstmt != null) try { cstmt.close(); } catch (Exception e) { } } 代码还挺长的。从上面的代码我们知道我们必须mock两个对象进去。一个是Connection, 一个是CallableStatementcstmt 。好再看看我们的测试代码

java 代码conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}"); conControl.setReturnValue(cstmt); conControl.replay();

cstmt.setString(1, "1"); cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); cstmt.executeUpdate(); cstmtControl.setReturnValue(1); cstmt.getString(2); cstmtControl.setReturnValue("5,4,3"); cstmt.close(); cstmtControl.replay();

String rusult = dao.getNumber(); Assert.assertEquals("5,4,3", rusult);

conControl.verify(); cstmtControl.verify();

oh,my got!测试代码比实现代码还要多。这段代码能执行吗?我想可以的。easymock的原理是记录-回放的模式。我想要做的工作是:1,记录你mock对象的工作记录,比如上面的代码我们mock对象的工作记录是:

java 代码conn.prepareCall("{call LUCK_LOAD_COMMON(?,?)}"); conControl.setReturnValue(cstmt); cstmt.setString(1, "1"); cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); cstmt.executeUpdate(); cstmtControl.setReturnValue(1); cstmt.getString(2); cstmtControl.setReturnValue("5,4,3"); cstmt.close();

如果你工作记录的代码要求有返回值的话,那么你必须提供一个自定义的值给它,否则会报错。比如上面的

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号