<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邏輯是否正確,就不是我們要做的事情  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 国产高潮久久免费观看| 免费av片在线观看网站| 国产亚洲欧洲Aⅴ综合一区| 久久精品免费观看| 97se亚洲国产综合自在线| 夜色阁亚洲一区二区三区| 3344在线看片免费| 亚洲综合色区中文字幕| 亚洲精品无码日韩国产不卡?V| 久草视频在线免费看| 亚洲乱码国产乱码精华| 亚洲AV永久精品爱情岛论坛| 毛片在线看免费版| 9久热这里只有精品免费| 亚洲一区精彩视频| 亚洲AV无码精品无码麻豆| 日韩在线天堂免费观看 | 无码天堂va亚洲va在线va| 亚洲成色www久久网站夜月| 在线a人片天堂免费观看高清| 99久久99这里只有免费的精品| 亚洲综合成人婷婷五月网址| 亚洲国产精品无码中文字| 日韩成人免费视频播放| 久久精品国产免费观看| 亚洲精品视频免费| 亚洲AV无码之国产精品| 亚洲精品视频久久| 亚洲人成在线播放网站| 国产成人精品免费视频软件| 在线视频精品免费| 无码精品一区二区三区免费视频| 免费人成网站永久| 亚洲乱人伦中文字幕无码| 91亚洲国产成人久久精品网址| 亚洲色成人网站WWW永久| 免费一级一片一毛片| 性感美女视频在线观看免费精品 | 亚洲va久久久噜噜噜久久男同| 国产a不卡片精品免费观看| 美女裸身网站免费看免费网站|