<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

    3G 手機開發網

       :: 首頁 :: 聯系 :: 聚合  :: 管理
      99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
    雖然以前用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. ??

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

    現在我總算是對ribbon說對于數據庫的測試還是真實環境的好。
    因為你測試的時候你不知道存儲過程是否正確。
    而且如果用真實的數據庫測試,相對與mock測試,則簡潔很多。而且清晰很多。
    上面只是在比較少邏輯的時候測試,如果代碼邏輯復雜,我覺得寫出來的測試代碼會更復雜,這有引出,可能維護測試代碼的工作比維護代碼的工作更累



    爬蟲工作室 -- 專業的手機軟件開發工作室
    3G視線 -- 專注手機軟件開發
    posted on 2007-03-21 13:29 3G工作室 閱讀(1542) 評論(2)  編輯  收藏 所屬分類: 單元測試

    Feedback

    # re: 用easymock測試jdbc 2007-03-22 11:56 mars
    最近才開始了解tdd,不過看你的代碼不太明白,你并不是要測試easymock而是要測試你的邏輯,因此你因該是你的業務代碼盡可能的獨立與第三方的api(這也是依賴注入和依賴查找之間的區別),這樣才好mock,另外,使用數據庫測試所面臨的問題更多.  回復  更多評論
      

    # re: 用easymock測試jdbc 2007-03-22 12:03 爬蟲工作室
    本來就不是去測試easymock。
    只是借助這個工具去測試我們的業務邏輯
    至于easymock邏輯是否正確,就不是我們要做的事情  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲成a人片在线观看国产| 亚洲一区二区三区免费观看| 日韩精品免费一级视频| 亚洲爱情岛论坛永久| 国产日韩精品无码区免费专区国产| 日本免费观看网站| 亚洲精品乱码久久久久久V| 岛国片在线免费观看| 亚洲欧美不卡高清在线| 四虎影在线永久免费四虎地址8848aa| 狠狠色伊人亚洲综合网站色 | 久久精品视频免费看| 亚洲va中文字幕无码久久不卡 | 亚洲网红精品大秀在线观看| 久久免费动漫品精老司机| 久久久久亚洲av无码专区导航| 99国产精品免费视频观看| 亚洲日本在线免费观看| 免费av欧美国产在钱| 亚洲AV电影天堂男人的天堂| 国产又大又粗又硬又长免费| 一级毛片在播放免费| 国产精品亚洲а∨无码播放| 久久成人a毛片免费观看网站| 亚洲精品国产啊女成拍色拍| a毛片基地免费全部视频| 亚洲精品无码不卡在线播放| 亚洲日韩在线中文字幕第一页| 免费看男人j放进女人j免费看| 亚洲午夜久久久久久尤物| 色视频色露露永久免费观看| ww在线观视频免费观看w| 亚洲第一精品福利| 免费无码A片一区二三区 | 丰满亚洲大尺度无码无码专线| 亚洲国产综合人成综合网站| 国产成人AV片无码免费| 亚洲精品9999久久久久无码| 国产亚洲精久久久久久无码AV| 中文字幕视频免费| 国产一区二区三区亚洲综合|