qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          Maven管理的Spring Web項(xiàng)目集成JUnit單元測(cè)試

            JUnit是一套優(yōu)秀的單元測(cè)試框架,而Maven是優(yōu)秀的Java項(xiàng)目構(gòu)建和管理工具,兩者結(jié)合可以很方便地對(duì)項(xiàng)目進(jìn)行自動(dòng)化測(cè)試
            一般的簡(jiǎn)單Java應(yīng)用就不多說(shuō)了,一些框架會(huì)提供針對(duì)junit的擴(kuò)展,使得測(cè)試變得更容易,例如Spring官方就提供了spring-test,用于提供獲取ApplicationContext等方面的支持。
            首先要做的是,改變JUnit的實(shí)際執(zhí)行類,將默認(rèn)的執(zhí)行類Suite替換為Spring提供的SpringJUnit4ClassRunner,也就是在測(cè)試類前面加上一個(gè)注解:
            @RunWith(SpringJUnit4ClassRunner.class)
            然后,我們需要告訴這個(gè)測(cè)試類Spring配置文件的位置:
          @ContextConfiguration(locations={"classpath:applicationContext.xml",
          "classpath:applicationContext-security.xml","file:src/main/webapp/WEB-INF/servlet.xml"})
            筆者這里展示了兩種配置文件路徑的寫法。前兩個(gè)是spring常見的配置文件,放在classpath根目錄下,而“file”開頭的路徑是完全限定路徑,默認(rèn)是相對(duì)于實(shí)際的項(xiàng)目路徑的,例如筆者使用Eclipse進(jìn)行開發(fā),這個(gè)路徑的寫法是相對(duì)于項(xiàng)目文件所在文件夾的根目錄的。該寫法適用于沒(méi)有直接放在classpath下的一些web相關(guān)的配置文件,例如本例展示的就是放在常見的WEB-INF目錄下的一個(gè)文件。
            基于以上描述,筆者寫了一個(gè)Spring測(cè)試基類:
          package com.test.basic;
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          import org.junit.Before;
          import org.junit.runner.RunWith;
          import org.springframework.test.context.ContextConfiguration;
          import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
          @RunWith(SpringJUnit4ClassRunner.class)
          @ContextConfiguration(locations={/*"file:src/main/webapp/WEB-INF/wxiot-servlet.xml",*/ "classpath:applicationContext.xml",
          "classpath:applicationContext-security.xml"})
          public classTestBase {
          protected Log logger = LogFactory.getLog(TestBase.class);
          @Before
          //一些公用的“初始化”代碼
          public void before(){
          }
          }


            有了這個(gè)基類,我們就可以動(dòng)手寫各個(gè)模塊的測(cè)試類了,只要在定義測(cè)試類的時(shí)候繼承TestBase,并在具體的方法前面加上@Test注解,筆者這里給出一個(gè)測(cè)試類的簡(jiǎn)單示例:
          import org.junit.Assert;
          import org.junit.Test;
          import org.springframework.beans.factory.annotation.Autowired;
          import com.reports.util.ActiveMQSender;
          import com.test.basic.TestBase;
          public classActiveMQSenderTest extends TestBase {
          @Autowired
          ActiveMQSendersender;
          @Test
          public void sendQTest(){
          Assert.assertNull(sender.sendInformationQ("發(fā),布。到?隊(duì)!列“的¥信息", "20131023102122", "20131025102122"));
          Assert.assertNotNull(sender.sendInformationQ("發(fā),布。到?隊(duì)!列“的¥信息", "20131023102122", "2013-10-26 10:21:22"));
          }
          @Test
          public void sendTopicTest(){
          Assert.assertNull(sender.sendInformationTopic("發(fā),布。到?Topic!的”信¥息", "20131023102122","20131025102122") );
          }
          }
            最后執(zhí)行“RunAs -> JUnit Test”即可開始JUnit單元測(cè)試了,使用Maven命令還可以方便地對(duì)特定目錄下(通常是src/test/java目錄)的所有測(cè)試類進(jìn)行批量測(cè)試。
            對(duì)于Java Web項(xiàng)目,某些業(yè)務(wù)類可能會(huì)帶有使用ServletContext等Web容器相關(guān)類的代碼,對(duì)于這些類我們就不能直接用JUnit來(lái)測(cè)試了,因?yàn)槟J(rèn)JUnit是沒(méi)有Web容器的,我們通常需要借助其它相關(guān)的輔助類或者模擬Web容器來(lái)進(jìn)行測(cè)試,例如利用struts2-junit-plugin的幫助來(lái)測(cè)試struts的action,這些內(nèi)容網(wǎng)上的資料很多,不在本文的討論范圍之內(nèi)。
            一些用到了web容器的業(yè)務(wù)類只需稍加修改,就可以直接用于JUnit測(cè)試。假設(shè)一個(gè)業(yè)務(wù)類使用了ServletContext來(lái)獲取容器內(nèi)的資源,例如一個(gè)配置文件:
            InputStream is=context.getResourceAsStream("/WEB-INF/configs/command-sender.xml");
            其中context變量保存了Web容器的ServletContext,如果直接使用JUnit來(lái)測(cè)試,必然導(dǎo)致空指針異常。此時(shí)我們可以稍作修改:
          InputStream is = null;
          if(null != context){
          is= context.getResourceAsStream("/WEB-INF/configs/command-sender.xml");
          }else{//JUnit Test環(huán)境下,使用ApplicationContext獲取配置文件
          //NearEast 2013-10-22
          try {
          is= SpringContextHolder.getApplicationContext().
          getResource("file:src/main/webapp/WEB-INF/configs/command-sender.xml").getInputStream();
          }catch(IOException e) {
          e.printStackTrace();
          }
          }
            其中,SpringContextHolder是筆者在《在Java Web應(yīng)用中獲取Spring管理的Bean的方法》提到的一個(gè)工具類,SpringContextHolder.getApplicationContext()即獲得Spring的ApplicationContext。資源的路徑使用了上文提到的完全限定路徑,我們也可以將其寫為類似“file:E:/Workspaces/workspace_test/test/src/main/webapp/WEB-INF/configs/command-sender.xml"”的形式。經(jīng)過(guò)上述修改之后,我們的業(yè)務(wù)類也可以直接利用JUnit執(zhí)行測(cè)試了。
            當(dāng)然我們還可以用其它方式獲取ApplicationContext,例如讓業(yè)務(wù)類實(shí)現(xiàn)ApplicationContextAware接口,并使用一個(gè)變量保存ApplicationContext。

          posted on 2013-10-31 11:12 順其自然EVO 閱讀(12544) 評(píng)論(1)  編輯  收藏 所屬分類: 敏捷測(cè)試

          評(píng)論

          # re: Maven管理的Spring Web項(xiàng)目集成JUnit單元測(cè)試 2014-08-18 14:25 程序員001

          版本呢? 你使用的哪個(gè)版本  回復(fù)  更多評(píng)論   

          <2013年10月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 南溪县| 巴里| 临朐县| 米脂县| 买车| 盐津县| 卫辉市| 娄烦县| 顺平县| 南城县| 恩平市| 元谋县| 东台市| 海阳市| 拉萨市| 绿春县| 温泉县| 高阳县| 广河县| 东光县| 昭苏县| 凤冈县| 忻城县| 万山特区| 常德市| 会同县| 沛县| 宜州市| 巢湖市| 静海县| 芒康县| 通河县| 同心县| 上犹县| 禄劝| 梨树县| 溆浦县| 阳西县| 潞城市| 界首市| 桐乡市|