程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 利用easymock測試jdbc分析

利用easymock測試jdbc分析

編輯:J2EE

雖然以前用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


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved