路是爬出來的

          用easymock測試jdbc

               雖然以前用easymock測試過Dao,但那些Dao的實現(xiàn),要么就hibernate,要么就用spring,而這兩個框架的執(zhí)行正確與否我們是不用關心的。JDBC是不是也這樣測試了。答案是肯定的。

                這幾天要用存儲過程跟jdbc來做個項目,想想也有好長一段時間沒用過JDBC來做項目了。該復習復習了。

                前陣子學了easymock,真好現(xiàn)在可以派上用場了。不過在測試的過程中還是遇到了不小問題,想來是自己基礎不好的緣故。



                 這次不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!測試代碼比實現(xiàn)代碼還要多。這段代碼能執(zhí)行嗎?

          我想可以的。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.   





           如果你工作記錄的代碼要求有返回值的話,那么你必須提供一個自定義的值給它,否則會報錯。比如上面的


        1.  cstmt.getString(2);  

        2.         cstmtControl.setReturnValue("5,4,3");   //自己定義的返回值,用作以后的比較。



        3. 上面的是記錄操作,回放的時候,easymock會把記錄的操作跟你實際的代碼進行比較,如果里面出了什么差錯,那么不好意思你的代碼有問題,請修正后再測試。



          如果有興趣可以自己試下。

          posted on 2006-12-30 09:06 路是爬出來的 閱讀(190) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 元阳县| 崇文区| 安达市| 武城县| 东山县| 赤壁市| 密云县| 保亭| 镇康县| 黔南| 汾阳市| 昌图县| 原平市| 蒙阴县| 阿坝县| 洪湖市| 望奎县| 阜新| 峨山| 乐昌市| 罗源县| 阿勒泰市| 景洪市| 济阳县| 宾川县| 江西省| 彭阳县| 建宁县| 德令哈市| 中山市| 宜君县| 故城县| 绥中县| 蓝山县| 曲靖市| 永善县| 东莞市| 旺苍县| 年辖:市辖区| 保德县| 丰镇市|