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

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

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

    posts - 5, comments - 24, trackbacks - 0, articles - 20
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    AppFuse學習筆記-單元測試 7

    Posted on 2007-04-27 17:35 kook 閱讀(357) 評論(0)  編輯  收藏 所屬分類: J2EE
    AppFuse為幾乎每一個類都提供了單元測試, 它使用JUnit框架進行測試。我們還是以User為例仔細分析一下,閱讀本篇的內(nèi)容之前,你至少應(yīng)該已經(jīng)對單元測試有一個概念。
    。
    1. DAO測試
        UserDAOTest用于測試UserDAO這個接口和它的實現(xiàn)UserDAOHibernate,它在test/dao/**/dao/中。
        所有的DAOTest都繼承自BaseDAOTestCase,BaseDAOTestCase繼承自TestCase。這個父類已經(jīng)為我們寫好了從Spring加載ApplicationContext的方法。
        setUp()里做了在測試之前的初始化工作,創(chuàng)建了UserDAO和RoleDAO的實例,tearDown()里做銷毀工作,這是每個Junit測試類都要做的事。
        以testUpdateUser()方法為例,該方法主要用于測試UserDAO的saveUser()方法是否正確。首先調(diào)用getUser()獲得用戶“tomcat”的信息,并修改其地址,然后調(diào)用saveUser()方法保存修改的記錄。重新獲得“tomcat”的信息,校驗其地址是否為新地址,如果地址為新地址,測試成功。接下來把“tomcat”的version屬性的值置空(version為驗證當前記錄是否為新記錄的標志,null表示新紀錄),重新保存“tomcat”,此時hibernate會認為該記錄為新記錄,進行insert操作,但username字段為主鍵不能重復,因此應(yīng)該拋出異常。如果捕獲到異常,測試成功。
        在控制臺進入項目根目錄,鍵入ant test-dao -Dtestcase=UserDAO,如果出現(xiàn)BUILD SUCCESSFUL,說明測試成功。這樣,我們不需要寫Manager、Action、JSP,不需要運行容器也可以確保我們的類正確了。

    2. Manager測試
        接下來繼續(xù)看測試UserManager的類UserManagerTest。它在test/service/**/service/中,繼承自BaseManagerTestCase,這個父類起著與BaseDAOTestCase類似的作用。
        與UserDAOTest不同的是UserManagerTest使用了jMock幫助其測試。jMock用于解決UserManager的依賴,因為UserManager中需要調(diào)用UserDAO的方法,而單元測試的基本規(guī)則是一次只測試一個對象,jMock幫助你把UserManager孤立起來,使它不會受到UserDAO的影響,我們來看它到底怎么做。
        在setUp()里,我們把UserDAO和RoleDAO放到Mock中,讓Mock來做UserDAO和RoleDAO的代理,并將這兩個“假冒的”DAO注入到UserManager中。
        還是以testSaveUser()為例來看這個test類怎么工作。首先創(chuàng)建User對象,設(shè)置用戶名為“tomcat”,權(quán)限為“user”。然后我們告訴Mock當UserManager調(diào)用UserDAO的getUser()方法并參數(shù)是“tomcat”時,我們期待UserDAO返回我們剛剛創(chuàng)建的那個對象。接下來調(diào)用UserManager的getUser()方法以獲得“tomcat”的信息。修改電話號碼的內(nèi)容。然后重置我們對Mock的要求。這次我們要求當UserManager調(diào)用UserDAO的saveUser方法時,不返回任何值。然后調(diào)用UserManager的saveUser()方法,校驗user是否為新的電話號碼和權(quán)限是否還是一個,若是,測試成功。verify()用于檢查所有應(yīng)該調(diào)用的方法是否都被調(diào)用了。通常來說,每對Mock對象調(diào)用了一次expects(),使用完后都要執(zhí)行一次verify()。
        在控制臺執(zhí)行ant test-service -Dtestcase=UserManager,看看結(jié)果。

    3. Action測試
        我們繼續(xù)看test/web/**/action下的UserActionTest。它繼承自BaseStrutsTestCase,BaseStrutsTestCase繼承MockStrutsTestCase,這個父類也做了類似BaseManagerTestCase的工作。
        Action是一個控制器,主要用于接收視圖層的請求,調(diào)用模型層的方法,然后返回視圖層。在這里我們不關(guān)心模型層或視圖層,我們只要關(guān)心Action是否能夠正確的得到請求和響應(yīng)請求,以及能夠正確的根據(jù)請求轉(zhuǎn)向。MockStrutsTestCase給了我們測試這方面很好的支持。
        以testSave()為例,首先創(chuàng)建一個UserForm,在里面放入部分數(shù)據(jù),將UserForm放入該Action所對應(yīng)的范圍內(nèi)。使用setRequestPathInfo()設(shè)置請求路徑為“/saveUser”,使用addRequestParameter()添加好請求參數(shù),actionPerform()方法將模擬請求的全過程。然后使用verifyForward()方法驗證請求轉(zhuǎn)發(fā)路徑是否正確。并驗證能不能在Action范圍內(nèi)得到UserForm。
        運行ant test-web -Dtestcase=UserAction,OK。
        要注意一點,這里的單元測試雖然繼承自MockStrutsTestCase,但沒有使用Mock,也就是說,它會真正執(zhí)行到所有相關(guān)的方法,包括修改數(shù)據(jù)庫。

    4. JSP測試
        我們同樣可以對JSP進行測試。這里有一個工具叫做Canoo WebTest,它使用xml配置的方式來測試JSP。
        進入test/web/,有一個web-tests.xml文件,里面有所有struts-config.xml中存在的path的測試。
        以SaveUser這個target為例,我們做一個簡單的說明。測試步驟包含在steps中,invoke中給這個step定一個ID號,設(shè)置請求的url:editProfile.html。接下來驗證JSP頁面的title是否與預期的一致。其中{webapp.prefix}和{userProfile.title}的內(nèi)容在WEB-INF\classes中的ApplicationResources中定義。接下來給表單中的文本域填寫內(nèi)容,使用clickbutton點擊保存按鈕,驗證保存后的頁面標題是否為預期的標題。
        這一測試需要運行容器,因此首先運行Tomcat,再在控制臺鍵入ant test-canoo -Dtestcase=UserTests或ant test-jsp -Dtestcase=PersonTests。使用ant run-all-tests無需運行Tomcat,Ant為你做這件事。

    主站蜘蛛池模板: 99视频在线精品免费观看6| 亚洲精品国产免费| 国产男女猛烈无遮挡免费视频 | 国内精品久久久久久久亚洲| 国产成人高清亚洲一区久久| 日韩免费视频播播| 亚洲精品无码久久久久牙蜜区| 成人毛片免费播放| 国产亚洲精品美女久久久久| 免费国产成人午夜电影| 18禁成人网站免费观看| 自怕偷自怕亚洲精品| 深夜福利在线免费观看| 亚洲人成网站在线观看青青| 杨幂最新免费特级毛片| 亚洲综合色自拍一区| 久久精品成人免费看| 亚洲精品人成电影网| 好大好硬好爽免费视频| 亚洲小说区图片区另类春色| 成人性生交大片免费看好| 国产成人免费片在线视频观看| 黄色毛片免费观看| 亚洲毛片av日韩av无码| 免费视频成人手机在线观看网址| 亚洲国产av高清无码| 爱丫爱丫影院在线观看免费| 亚洲黄色高清视频| 成人黄18免费视频| 皇色在线免费视频| 亚洲另类自拍丝袜第1页| 国产精品免费_区二区三区观看| 免费一区二区三区在线视频| 亚洲国产人成网站在线电影动漫| 国产性生大片免费观看性| 亚洲人成电影福利在线播放| 免费无码不卡视频在线观看| 99久久婷婷免费国产综合精品| 亚洲一区在线观看视频| 亚洲av日韩片在线观看| 亚洲一区二区三区免费视频|