服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

利用easymock测试jdbc的过程详细解析

虽然以前用easymock测试过dao,但那些dao的实现,要么就hibernate,要么就用spring,而这两个框架的执行正确与否我们是不用关心的。jdbc是不是也这样测试了。答案是肯定的。

这几天要用存储过程跟jdbc来做个项目,想想也有好长一段时间没用过jdbc来做项目了。该复习复习了。

前阵子学了easymock,真好现在可以派上用场了。不过在测试的过程中还是遇到了不小问题,想来是自己基础不好的缘故。

先看看我们要测试的代码

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


扫描关注微信公众号