當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring应用的单元测试
生活随笔
收集整理的這篇文章主要介紹了
Spring应用的单元测试
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?Spring應(yīng)用的單元測(cè)試
?????? 單元測(cè)試現(xiàn)在越來越被廣泛重視起來,而Spring更是將時(shí)下比較流行的Junit開元測(cè)試框架進(jìn)行整合下面我簡(jiǎn)單的介紹一下在Sping中該如何對(duì)代碼進(jìn)行單元測(cè)試(本節(jié)會(huì)認(rèn)為讀者已經(jīng)具備了Junit基礎(chǔ)方面的知識(shí))。按照Spring的推薦,在單元測(cè)試時(shí)不應(yīng)該依賴于Spring容器,也就是說不應(yīng)該在單元測(cè)試是啟動(dòng)ApplicationContext并從中獲取Bean,相反應(yīng)該通過模擬對(duì)象完成單元測(cè)試。而Spring就提供了這樣一個(gè)類供大家繼承。下面來看看示例代碼: ?????? 1)自動(dòng)裝配的測(cè)試用例 代碼清單1 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.tony.web.dao.FooDao; ? @Service public class FooService { ??? @Autowired ??? private FooDao dao; ??? public String save(String name){ ?????? if(name == null || "".equals(name)) ?????????? throw new RuntimeException("Name is null"); ?????? return dao.save(name); ??? } } import org.springframework.stereotype.Repository; @Repository public class FooDao { ??? public String save(String name){ ?????? return "success"; ??? } } import org.springframework.test. AbstractDependencyInjectionSpringContextTests; import com.tony.web.service.FooService; public class MyTest extends AbstractDependencyInjectionSpringContextTests{ ??? protected FooService fooService; ??? //set方法 ??? public void setFooService(FooService fooService) { ?????? this.fooService = fooService; ??? } ??? //指定Spring配置文件的位置 ??? protected String[] getConfigLocations(){ ?????? return new String[]{"spring-config-beans.xml"}; ??? } ??? //測(cè)試方法 ??? public void testSave(){ ?????? String str = this.fooService.save("Tony"); ?????? System.out.print(str); ?????? assertEquals("success", str); ??? } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://...> ??? <context:component-scan base-package="com.tony"/> </beans> 代碼清單1中定義了FooService.java和FooDao.java兩個(gè)Bean已經(jīng)使用 @Autowired進(jìn)行了裝配,我們的單元測(cè)試類MyTest繼承了 AbstractDependencyInjectionSpringContextTests類,配置好fooService的set方法并且指定Spring配置文件的位置后,當(dāng)測(cè)試用例運(yùn)行時(shí)我們需要的fooService會(huì)自動(dòng)注入進(jìn)來,我們只要在testSave方法中直接使用就可以了,還有兩外一種寫法 代碼清單2 public class MyTest extends AbstractDependencyInjectionSpringContextTests{ ??? protected FooService fooService; ??? ??? public MyTest(){ ?????? //啟用直接對(duì)屬性變量進(jìn)行注入的機(jī)制 this.setPopulateProtectedVariables(true); ??? } ??? protected String[] getConfigLocations(){ ?????? return new String[]{"spring-config-beans.xml"}; ??? } ??? public void testSave(){ ?????? String str = this.fooService.save("Tony"); ?????? System.out.print(str); ?????? assertEquals("success", str); ??? } } 代碼清單2中我們移除了set方法,增加了一個(gè)構(gòu)造函數(shù),在構(gòu)造函數(shù)中調(diào)用父類的方法啟用直接對(duì)屬性變量進(jìn)行注入的機(jī)制。有時(shí)我們測(cè)試的時(shí)候會(huì)操作數(shù)據(jù)庫插入一條記錄,由于我們不會(huì)每次都修改測(cè)試的數(shù)據(jù),當(dāng)我們?cè)俅尾迦胪瑯拥臄?shù)據(jù)時(shí)數(shù)據(jù)庫肯定會(huì)要報(bào)錯(cuò)了,此時(shí)我們需要既能測(cè)試又能不讓測(cè)試的數(shù)據(jù)在數(shù)據(jù)庫中起作用,Spring就知道我們的這個(gè)需要,為我們準(zhǔn)備了AbstractTransactionalSpringContextTests這個(gè)類。 代碼清單3 import org.springframework.test. AbstractTransactionalSpringContextTests; import com.tony.web.service.FooService; public class MyTest extends AbstractTransactionalSpringContextTests{ ??? protected FooService fooService; ??? public MyTest(){ ?????? this.setPopulateProtectedVariables(true); ??? } ??? protected String[] getConfigLocations(){ ?????? return new String[]{"spring-config-beans.xml"}; ??? } //測(cè)試方法中的數(shù)據(jù)操作將在方法返回前被回滾,不會(huì)對(duì)數(shù)據(jù)庫產(chǎn)生永久性數(shù)據(jù)操作,下一//次運(yùn)行該測(cè)試方法時(shí),依舊可以成功運(yùn)行. ??? public void testSave(){ ?????? String str = this.fooService.save("Tony"); ?????? System.out.print(str); ?????? assertEquals("success", str); ??? } } ??? 這樣就可以在方法返回之前將測(cè)試數(shù)據(jù)回滾,以保證下次單元測(cè)試的成功。總結(jié)
以上是生活随笔為你收集整理的Spring应用的单元测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 2.5 基于注解驱动的 S
- 下一篇: oracle查询指定行数间的记录