操作easymock测试jdbc阐明
固然以前用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