Maven管理的Spring Web項目集成JUnit單元測試
一般的簡單Java應用就不多說了,一些框架會提供針對junit的擴展,使得測試變得更容易,例如Spring官方就提供了spring-test,用于提供獲取ApplicationContext等方面的支持。
首先要做的是,改變JUnit的實際執行類,將默認的執行類Suite替換為Spring提供的SpringJUnit4ClassRunner,也就是在測試類前面加上一個注解:
@RunWith(SpringJUnit4ClassRunner.class)
然后,我們需要告訴這個測試類Spring配置文件的位置:
@ContextConfiguration(locations={"classpath:applicationContext.xml",
"classpath:applicationContext-security.xml","file:src/main/webapp/WEB-INF/servlet.xml"})
筆者這里展示了兩種配置文件路徑的寫法。前兩個是spring常見的配置文件,放在classpath根目錄下,而“file”開頭的路徑是完全限定路徑,默認是相對于實際的項目路徑的,例如筆者使用Eclipse進行開發,這個路徑的寫法是相對于項目文件所在文件夾的根目錄的。該寫法適用于沒有直接放在classpath下的一些web相關的配置文件,例如本例展示的就是放在常見的WEB-INF目錄下的一個文件。
基于以上描述,筆者寫了一個Spring測試基類:
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(){ } } |
有了這個基類,我們就可以動手寫各個模塊的測試類了,只要在定義測試類的時候繼承TestBase,并在具體的方法前面加上@Test注解,筆者這里給出一個測試類的簡單示例:
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("發,布。到?隊!列“的¥信息", "20131023102122", "20131025102122")); Assert.assertNotNull(sender.sendInformationQ("發,布。到?隊!列“的¥信息", "20131023102122", "2013-10-26 10:21:22")); } @Test public void sendTopicTest(){ Assert.assertNull(sender.sendInformationTopic("發,布。到?Topic!的”信¥息", "20131023102122","20131025102122") ); } } |
最后執行“RunAs -> JUnit Test”即可開始JUnit單元測試了,使用Maven命令還可以方便地對特定目錄下(通常是src/test/java目錄)的所有測試類進行批量測試。
對于Java Web項目,某些業務類可能會帶有使用ServletContext等Web容器相關類的代碼,對于這些類我們就不能直接用JUnit來測試了,因為默認JUnit是沒有Web容器的,我們通常需要借助其它相關的輔助類或者模擬Web容器來進行測試,例如利用struts2-junit-plugin的幫助來測試struts的action,這些內容網上的資料很多,不在本文的討論范圍之內。
一些用到了web容器的業務類只需稍加修改,就可以直接用于JUnit測試。假設一個業務類使用了ServletContext來獲取容器內的資源,例如一個配置文件:
InputStream is=context.getResourceAsStream("/WEB-INF/configs/command-sender.xml");
其中context變量保存了Web容器的ServletContext,如果直接使用JUnit來測試,必然導致空指針異常。此時我們可以稍作修改:
InputStream is = null; if(null != context){ is= context.getResourceAsStream("/WEB-INF/configs/command-sender.xml"); }else{//JUnit Test環境下,使用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應用中獲取Spring管理的Bean的方法》提到的一個工具類,SpringContextHolder.getApplicationContext()即獲得Spring的ApplicationContext。資源的路徑使用了上文提到的完全限定路徑,我們也可以將其寫為類似“file:E:/Workspaces/workspace_test/test/src/main/webapp/WEB-INF/configs/command-sender.xml"”的形式。經過上述修改之后,我們的業務類也可以直接利用JUnit執行測試了。
當然我們還可以用其它方式獲取ApplicationContext,例如讓業務類實現ApplicationContextAware接口,并使用一個變量保存ApplicationContext。
posted on 2013-10-31 11:12 順其自然EVO 閱讀(12544) 評論(1) 編輯 收藏 所屬分類: 敏捷測試