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

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

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

    Java蜘蛛人 歡迎大家

    歡迎大家 來(lái)到我的blog , 如果我身邊的朋友 有什么不懂可以直接來(lái)問(wèn)我 我會(huì)細(xì)心的幫助你的. 如果網(wǎng)絡(luò)上的朋友有什么不懂的 可以加我Java蜘蛛人 QQ48187537
    posts - 54, comments - 192, trackbacks - 0, articles - 1

     

     利用spring的mock類(lèi)進(jìn)行單元測(cè)試:
    spring框架提供了大量測(cè)試的mock類(lèi),包括與jndi,porlet,web應(yīng)用相關(guān)的mock類(lèi)。尤其是web應(yīng)用相關(guān)的mock類(lèi),可以大大提高web組件測(cè)試的方便性。

    打開(kāi)spring的下載包的mock文件夾(路徑...mock\org\springframework\mock\web),就發(fā)覺(jué)有如下幾個(gè)文件:

    MockHttpServletRequest:是HttpServletRequest接口的mock實(shí)現(xiàn),用來(lái)模擬客戶端的HTTP請(qǐng)求,很常用的一個(gè)類(lèi)。

    MockHttpServletResponse:是HttpServletResponse接口的mock實(shí)現(xiàn),用于模擬服務(wù)器對(duì)客戶端的響應(yīng)。

    MockHttpSession:是對(duì)HttpSession接口的mock實(shí)現(xiàn)。

    DelegatingServletInputStream:是對(duì)ServletInputStream接口的mock實(shí)現(xiàn)。

    DelegatingServletOutputStream:ServletOutputStream的mock實(shí)現(xiàn)。需要攔截和分析服務(wù)器的輸出的流的內(nèi)容,可以使用該類(lèi)。

    其他的,例如MockFilterConfig,MockPageContext(可以測(cè)試預(yù)編譯的JSP),MockRequestDispatcher,MockServletConfig看名稱就知道大概是mock什么的。
    舉一個(gè)例子:
        MockHttpServletRequest request =  new MockHttpServletRequest("POST","/index.do");  
        request.addParameter("username","name");  
        request.addParameter("password","word"); 

    利用spring來(lái)進(jìn)行集成測(cè)試
    1、AbstractSpringContextTests類(lèi)[1],該類(lèi)全部方法是protected的,通常不使用這個(gè)類(lèi),而使用它的子類(lèi)們

    2、AbstractDependencyInjectionSpringContextTests類(lèi)[2]:繼承于類(lèi)[1]:名字N長(zhǎng)的。如果僅僅使用Spring依賴注入功能可以讓測(cè)試用例繼承該類(lèi)

    3、AbstractTransactionalSpringContextTests類(lèi)[3]:繼承于類(lèi)[2],繼承該類(lèi)的測(cè)試用例在spring管理的事務(wù)中進(jìn)行,測(cè)試完后對(duì)數(shù)據(jù)庫(kù)的記錄不會(huì)造成任何影響你對(duì)數(shù)據(jù)庫(kù)進(jìn)行一些操作后,它會(huì)自動(dòng)把數(shù)據(jù)庫(kù)回滾,這樣就保證了你的測(cè)試對(duì)于環(huán)境沒(méi)有任何影響

    4、AbstractTransactionalDataSourceSpringContextTests繼承于類(lèi)[3],功能更強(qiáng)大,用于測(cè)試持久層組件,看其源代碼,有一行"protected JdbcTemplate jdbcTemplate;",提供了一個(gè)JdbcTemplate的變量,通過(guò)該對(duì)象可以直接操作數(shù)據(jù)庫(kù)。

    http://lighter.javaeye.com/blog/41733 還提供了兩個(gè)用spring來(lái)進(jìn)行集成測(cè)試(對(duì)數(shù)據(jù)庫(kù)操作進(jìn)行測(cè)試),業(yè)務(wù)測(cè)試(對(duì)業(yè)務(wù)層進(jìn)行測(cè)試)的例子供下載。

    ***如何在你的TestCase Class里取得spring context (注意路徑問(wèn)題)?***

    你的TestCase Class必須繼承的是上述四個(gè)AbstractXXXSpringContextTests中的其中一個(gè),那么就必須實(shí)現(xiàn)下面這個(gè)方法來(lái)取得spring context

       protected abstract String[] getConfigLocations();

    例如:

     public String[] getConfigLocations() {
        String[] configLocations = { "applicationContext.xml","hibernate-context.xml" };
        return configLocations;
     }


    請(qǐng) 注意要加載的context xml file的路徑問(wèn)題:上述的代碼是基于classpath,因此applicationContext.xml和hibernate- context.xml必須放在classpath里(方法一是把xml files放到WEB-INF/classes目錄下,另一種方法就是在project properties里把xml files的路徑加到classpath里)

    那么如果你一定要把context xml files放到WEB-INF目錄下,也是可以的,那么應(yīng)該基于file(基于file的相對(duì)路徑是相對(duì)于project root folder),代碼如下:

     public String[] getConfigLocations() {
        String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml"};
        return configLocations;
     }

    AbstractXXXSpringContextTests就會(huì)根據(jù)根據(jù)getConfigLocations方法返回的context xml位置的數(shù)組來(lái)加載并且對(duì)加載的Context提供緩存。 這是非常重要的,因?yàn)槿绻阍趶氖乱粋€(gè)大項(xiàng)目時(shí),啟動(dòng)時(shí)間可能成為一個(gè)問(wèn)題--這不是Spring自身的開(kāi)銷(xiāo),而是被Spring容器實(shí)例化的對(duì)象在實(shí)例 化自身時(shí)所需要的時(shí)間。例如,一個(gè)包括50-100個(gè)Hibernate映射文件的項(xiàng)目可能需要10-20秒的時(shí)間來(lái)加載上述的映射文件,如果在運(yùn)行每個(gè) 測(cè)試fixture里的每個(gè)測(cè)試案例前都有這樣的開(kāi)銷(xiāo),將導(dǎo)致整個(gè)測(cè)試工作的延時(shí),最終有可能(實(shí)際上很可能)降低效率。

    在某種極偶然的情況下,某個(gè)測(cè)試可能“弄臟”了配置場(chǎng)所,并要求重新加載--例如改變一個(gè)bean的定義或者一個(gè)應(yīng)用對(duì)象的狀態(tài)--你可以調(diào)用 AbstractDependencyInjectionSpringContextTests 上的 setDirty() 方法來(lái)重新加載配置并在執(zhí)行下一個(gè)測(cè)試案例前重建application context

     

    當(dāng)類(lèi) AbstractDependencyInjectionSpringContextTests(及其子類(lèi))裝載你的Application Context時(shí),你可以通過(guò)Setter方法來(lái)注入你想要的來(lái)自context的bean,而不需要顯式的調(diào)用applicationContext.getBean(XXX)。因?yàn)锳bstractDependencyInjectionSpringContextTests會(huì)從getConfigLocations()方法指定的配置文件中幫你自動(dòng)注入

    下面的例子就是通過(guò)setter方法來(lái)獲得context里的ProductManager bean:

    public class MyTest extends AbstractDependencyInjectionSpringContextTests {
        ProductManager productManager;

        public String[] getConfigLocations() {
            String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };
            return configLocations;
        }

        public void testGetProduct() {
           assertEquals("tomson",productManager.getProductByName("tomson").getName());
        }
       

        //通過(guò)setter方法自動(dòng)從context里注入productManager bean,而不用顯示調(diào)用applicationContext.getBean(XXX)
        public void setProductManager(ProductManager productManager) {
           this.productManager = productManager;
        }
    }

    但是如 果context里有多個(gè)bean都定義為一個(gè)類(lèi)型(例如有多個(gè)bean都是ProductManager class類(lèi)型的),那么對(duì)這些bean就無(wú)法通過(guò)setter方法來(lái)自動(dòng)依賴注入(因?yàn)橛卸鄠€(gè)bean同一個(gè)類(lèi)型,不知要自動(dòng)注入哪個(gè))。在這種情況下 你需要顯示的調(diào)用applicationContext.getBean(XXX)來(lái)注入。如:

    public class MyTest extends AbstractDependencyInjectionSpringContextTests {
       ProductManager productManager;

       public String[] getConfigLocations() {
          String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };
          return configLocations;
       }

       public void onSetUp() {
           productManager = (ProductManager) applicationContext.getBean("productManager");
       }

       public void testGetProduct() {
           assertEquals("tomson",productManager.getProductByName("tomson").getName());
       }
     
    }

    如果你的TestCase不使用依賴注入,只要不定義任何setters方法即可或者你可以繼承 AbstractSpringContextTests --這個(gè) org.springframework.test 包中的根類(lèi),而不是繼承AbstractDependencyInjectionSpringContextTests(及其子類(lèi))。這是因?yàn)锳bstractSpringContextTests 只包括用來(lái)加載Spring Context的便利方法但沒(méi)有自動(dòng)依賴注入的功能。

    Feedback

    # re: spring junit 測(cè)試  回復(fù)  更多評(píng)論   

    2009-06-04 17:02 by 無(wú)量字幕
    不錯(cuò)

    # re: spring junit 測(cè)試  回復(fù)  更多評(píng)論   

    2009-06-05 17:32 by hellworld
    好厲害呀,鄭老師,你是IT蜘蛛俠!好屌啊!

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲视频在线不卡| 亚洲国产成人五月综合网| 红杏亚洲影院一区二区三区| 亚洲精品成a人在线观看☆| 免费看成人AA片无码视频羞羞网| 亚洲AV美女一区二区三区| 久久一区二区免费播放| 精品国产亚洲一区二区在线观看| 天堂亚洲免费视频| 亚洲精品无码永久中文字幕| 一级特黄aaa大片免费看| 亚洲成A人片在线观看无码3D| 国产亚洲精品91| 亚洲毛片不卡av在线播放一区| 偷自拍亚洲视频在线观看| 又黄又爽的视频免费看| 四虎影视在线看免费观看| 亚洲日本中文字幕一区二区三区 | 免费看美女被靠到爽| 久久亚洲国产成人影院| 国产网站免费观看| 日亚毛片免费乱码不卡一区| 国产亚洲成归v人片在线观看| 免费在线观影网站| 久久综合亚洲色HEZYO社区 | 毛片在线全部免费观看| 亚洲天天在线日亚洲洲精| 我们的2018在线观看免费高清| 久久综合久久综合亚洲| 亚洲 另类 无码 在线| 丝瓜app免费下载网址进入ios | 国产福利电影一区二区三区,亚洲国模精品一区 | 中文字幕视频免费| 男人天堂2018亚洲男人天堂| 亚洲精品动漫人成3d在线| 嫩草影院在线播放www免费观看| 亚洲成av人片不卡无码| 亚洲精品黄色视频在线观看免费资源 | 国产亚洲精品久久久久秋霞| 在免费jizzjizz在线播 | 特黄特色大片免费|