路是爬出來的

          用easymock測試jdbc

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

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

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



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

          我想可以的。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)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 疏附县| 万宁市| 巴马| 新龙县| 东港市| 彭泽县| 青冈县| 香格里拉县| 五河县| 衡阳县| 达拉特旗| 湖州市| 黄冈市| 鹿邑县| 即墨市| 兴文县| 绥宁县| 阜平县| 手游| 和林格尔县| 阳信县| 阳高县| 噶尔县| 大新县| 禹城市| 鸡西市| 蒲城县| 徐汇区| 天镇县| 江油市| 桐庐县| 珲春市| 宁晋县| 灌阳县| 镇赉县| 信丰县| 田林县| 错那县| 罗平县| 牟定县| 台江县|