国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Spring怎樣更好的用JUnit進(jìn)行單元測試

2019-11-08 01:56:52
字體:
供稿:網(wǎng)友

平時(shí)開發(fā)中發(fā)現(xiàn)通過SPRing進(jìn)行bean管理后,做測試會(huì)有各種不足: 例如,很多人做單元測試的時(shí)候,還要在Before方法中,初始化Spring容器,導(dǎo)致容器被初始化多次。

@Before public void init() { applicationContext ctx = new FileSystemxmlApplicationContext( "classpath:spring/spring-basic.xml"); baseDao = (IBaseDao) ctx.getBean("baseDao"); assertNotNull(baseDao); }

在開發(fā)基于Spring的應(yīng)用時(shí),如果你還直接使用Junit進(jìn)行單元測試,那你就錯(cuò)過了Spring滿漢全席中最重要的一道硬菜。 再說這道菜之前,我們先來討論下,在基于Spring的javaweb項(xiàng)目中使用Junit直接進(jìn)行單元測試有什么不足

1)導(dǎo)致多次Spring容器初始化問題

根據(jù)JUnit測試方法的調(diào)用流程,每執(zhí)行一個(gè)測試方法都會(huì)創(chuàng)建一個(gè)測試用例的實(shí)例并調(diào)用setUp()方法。由于一般情況下,我們在setUp()方法中初始化Spring容器,這意味著如果測試用例有多少個(gè)測試方法,Spring容器就會(huì)被重復(fù)初始化多次。雖然初始化Spring容器的速度并不會(huì)太慢,但由于可能會(huì)在Spring容器初始化時(shí)執(zhí)行加載Hibernate映射文件等耗時(shí)的操作,如果每執(zhí)行一個(gè)測試方法都必須重復(fù)初始化Spring容器,則對測試性能的影響是不容忽視的;

使用Spring測試套件,Spring容器只會(huì)初始化一次!

2)需要使用硬編碼方式手工獲取Bean 在測試用例類中我們需要通過ctx.getBean()方法從Spirng容器中獲取需要測試的目標(biāo)Bean,并且還要進(jìn)行強(qiáng)制類型轉(zhuǎn)換的造型操作。這種乏味的操作迷漫在測試用例的代碼中,讓人覺得煩瑣不堪;

使用Spring測試套件,測試用例類中的屬性會(huì)被自動(dòng)填充Spring容器的對應(yīng)Bean ,無須在手工設(shè)置Bean!

3)數(shù)據(jù)庫現(xiàn)場容易遭受破壞 測試方法對數(shù)據(jù)庫的更改操作會(huì)持久化到數(shù)據(jù)庫中。雖然是針對開發(fā)數(shù)據(jù)庫進(jìn)行操作,但如果數(shù)據(jù)操作的影響是持久的,可能會(huì)影響到后面的測試行為。舉個(gè)例子,用戶在測試方法中插入一條ID為1的User記錄,第一次運(yùn)行不會(huì)有問題,第二次運(yùn)行時(shí),就會(huì)因?yàn)橹麈I沖突而導(dǎo)致測試用例失敗。所以應(yīng)該既能夠完成功能邏輯檢查,又能夠在測試完成后恢復(fù)現(xiàn)場,不會(huì)留下“后遺癥”;

使用Spring測試套件,Spring會(huì)在你驗(yàn)證后,自動(dòng)回滾對數(shù)據(jù)庫的操作,保證數(shù)據(jù)庫的現(xiàn)場不被破壞,因此重復(fù)測試不會(huì)發(fā)生問題

4)不方便對數(shù)據(jù)操作正確性進(jìn)行檢查 假如我們向登錄日志表插入了一條成功登錄日志,可是我們卻沒有對t_login_log表中是否確實(shí)添加了一條記錄進(jìn)行檢查。一般情況下,我們可能是打開數(shù)據(jù)庫,肉眼觀察是否插入了相應(yīng)的記錄,但這嚴(yán)重違背了自動(dòng)測試的原則。試想在測試包括成千上萬個(gè)數(shù)據(jù)操作行為的程序時(shí),如何用肉眼進(jìn)行檢查?

只要你繼承Spring的測試套件的用例類,你就可以通過jdbcTemplate在同一事務(wù)中訪問數(shù)據(jù)庫,查詢數(shù)據(jù)的變化,驗(yàn)證操作的正確性!

看完上面的內(nèi)容,相信,你已經(jīng)知道我說的硬菜是什么了。下面,讓我們看看,使用Spring測試套件后,代碼是如何變優(yōu)雅的。

加入依賴包 使用spring的測試框架需要加入以下依賴包: JUnit 4 Spring Test (Spring框架中的test包) Spring 相關(guān)其他依賴包(不再贅述了,就是context等包)

如果使用maven,在基于spring的項(xiàng)目中添加如下依賴:

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version> 3.2.4.RELEASE </version> <scope>provided</scope> </dependency>

創(chuàng)建測試源目錄和包

  在此,推薦創(chuàng)建一個(gè)和src平級的源文件目錄,因?yàn)閟rc內(nèi)的類都是為日后產(chǎn)品準(zhǔn)備的,而此處的類僅僅用于測試。而包的名稱可以和src中的目錄同名,這樣由于在test源目錄中,所以不會(huì)有沖突,而且名稱又一模一樣,更方便檢索。這也是Maven的約定。

創(chuàng)建測試類 1)基類,其實(shí)就是用來加載配置文件的

@RunWith(SpringJUnit4ClassRunner.class) //使用junit4進(jìn)行測試 @ContextConfiguration ({"/spring/app*.xml","/spring/service/app*.xml"}) //加載配置文件 //------------如果加入以下代碼,所有繼承該類的測試類都會(huì)遵循該配置,也可以不加,在測試類的方法上///控制事務(wù),參見下一個(gè)實(shí)例 //這個(gè)非常關(guān)鍵,如果不加入這個(gè)注解配置,事務(wù)控制就會(huì)完全失效! //@Transactional //這里的事務(wù)關(guān)聯(lián)到配置文件中的事務(wù)控制器(transactionManager = "transactionManager"),同時(shí)//指定自動(dòng)回滾(defaultRollback = true)。這樣做操作的數(shù)據(jù)才不會(huì)污染數(shù)據(jù)庫! //@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) //------------ public class BaseJunit4Test { }

2)接著是我們自己的測試類

public class UserAssignServiceTest extends BaseJunit4Test{ @Resource //自動(dòng)注入,默認(rèn)按名稱 private IBaseDao baseDao; @Test //標(biāo)明是測試方法 @Transactional //標(biāo)明此方法需使用事務(wù) @Rollback(false) //標(biāo)明使用完此方法后事務(wù)不回滾,true時(shí)為回滾 public void insert( ) { String sql="insert into user(name,passWord) values(?,?)"; Object[] objs=new Object[]{"00","000"}; baseDao.insert( sql , objs ); String sql1="select * from user where name=? and password=? "; List<Map<String,Object>> list=baseDao.queryForList( sql1 , objs ); System.out.println(list); assertTrue(list.size( )>0); } }
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 海晏县| 建阳市| 库尔勒市| 广州市| 海南省| 方城县| 巩义市| 崇明县| 万山特区| 永顺县| 金昌市| 桂阳县| 龙里县| 敖汉旗| 平远县| 长海县| 漳州市| 乌拉特前旗| 遂川县| 柘荣县| 松滋市| 清水河县| 兴业县| 辽宁省| 昭平县| 都匀市| 弥渡县| 临漳县| 鹤壁市| 澄迈县| 漳平市| 兴城市| 柳河县| 洛浦县| 民勤县| 陆川县| 当雄县| 渝北区| 南雄市| 中山市| 济源市|