詳解Junit 測試之 Spring Test
在做spring相關(guān)測試時(shí)比較麻煩,如果只用JUnit測試,需要沒測有初始化一下applicationContext,效率比較底下,而且也有不足之處。
1、導(dǎo)致多次Spring容器初始化問題
根據(jù)JUnit測試方法的調(diào)用流程,每執(zhí)行一個(gè)測試方法都會創(chuàng)建一個(gè)測試用例的實(shí)例并調(diào)用setUp()方法。由于一般情況下,我們在setUp()方法 中初始化Spring容器,這意味著如果測試用例有多少個(gè)測試方法,Spring容器就會被重復(fù)初始化多次。雖然初始化Spring容器的速度并不會太 慢,但由于可能會在Spring容器初始化時(shí)執(zhí)行加載Hibernate映射文件等耗時(shí)的操作,如果每執(zhí)行一個(gè)測試方法都必須重復(fù)初始化Spring容 器,則對測試性能的影響是不容忽視的;使用Spring測試套件,Spring容器只會初始化一次!
2、需要使用硬編碼方式手工獲取Bean
在測試用例類中我們需要通過ctx.getBean()方法從Spirng容器中獲取需要測試的目標(biāo)Bean,并且還要進(jìn)行強(qiáng)制類型轉(zhuǎn)換的造型操作。這種乏味的操作迷漫在測試用例的代碼中,讓人覺得煩瑣不堪;使用Spring測試套件,測試用例類中的屬性會被自動填充Spring容器的對應(yīng)Bean,無須在手工設(shè)置Bean!
3、數(shù)據(jù)庫現(xiàn)場容易遭受破壞
測試方法對數(shù)據(jù)庫的更改操作會持久化到數(shù)據(jù)庫中。雖然是針對開發(fā)數(shù)據(jù)庫進(jìn)行操作,但如果數(shù)據(jù)操作的影響是持久的,可能會影響到后面的測試行為。舉個(gè)例子, 用戶在測試方法中插入一條ID為1的User記錄,第一次運(yùn)行不會有問題,第二次運(yùn)行時(shí),就會因?yàn)橹麈I沖突而導(dǎo)致測試用例失敗。所以應(yīng)該既能夠完成功能邏 輯檢查,又能夠在測試完成后恢復(fù)現(xiàn)場,不會留下“后遺癥”;使用Spring測試套件,Spring會在你驗(yàn)證后,自動回滾對數(shù)據(jù)庫的操作,保證數(shù)據(jù)庫的現(xiàn)場不被破壞,因此重復(fù)測試不會發(fā)生問題!
4、不方便對數(shù)據(jù)操作正確性進(jìn)行檢查
假如我們向登錄日志表插入了一條成功登錄日志,可是我們卻沒有對t_login_log表中是否確實(shí)添加了一條記錄進(jìn)行檢查。一般情況下,我們可能是打開 數(shù)據(jù)庫,肉眼觀察 是否插入了相應(yīng)的記錄,但這嚴(yán)重違背了自動測試的原則。試想在測試包括成千上萬個(gè)數(shù)據(jù)操作行為的程序時(shí),如何用肉眼進(jìn)行檢查?
只要你繼承Spring的測試套件的用例類,你就可以通過jdbcTemplate在同一事務(wù)中訪問數(shù)據(jù)庫,查詢數(shù)據(jù)的變化,驗(yàn)證操作的正確性!
1. maven 配置
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.12</version> <scope>test</scope> </dependency>
2.創(chuàng)建BaseJunit4Test基類
創(chuàng)建 Spring Test 的基類,該類主要用來加載配置文件,設(shè)置web環(huán)境。
所有的測試類,都繼承該類即可。
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4進(jìn)行測試
@ContextConfiguration(locations={"classpath:spring.xml","classpath:spring-mvc.xml","classpath:spring-hibernate.xml","classpath:spring-ehcache.xml"}) //加載配置文件
@WebAppConfiguration("src/main/webapp")
//------------如果加入以下代碼,所有繼承該類的測試類都會遵循該配置,也可以不加,在測試類的方法上///控制事務(wù),參見下一個(gè)實(shí)例
//這個(gè)非常關(guān)鍵,如果不加入這個(gè)注解配置,事務(wù)控制就會完全失效!
//@Transactional
//這里的事務(wù)關(guān)聯(lián)到配置文件中的事務(wù)控制器(transactionManager = "transactionManager"),同時(shí)//指定自動回滾(defaultRollback = true)。這樣做操作的數(shù)據(jù)才不會污染數(shù)據(jù)庫!
//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
//------------
public class BaseJunit4Test{
}
- @RunWith(SpringJUnit4ClassRunner.class) 使用junit4進(jìn)行測試
- @ContextConfiguration() 加載spring相關(guān)的配置文件
- @WebAppConfiguration() 設(shè)置web項(xiàng)目的環(huán)境,如果是Web項(xiàng)目,必須配置該屬性,否則無法獲取 web 容器相關(guān)的信息(request、context 等信息)
3.測試類
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
import cn.com.infcn.ade.service.UserManagerService;
import cn.com.infcn.model.pmodel.AdeUser;
public class UserTest extends BaseJunit4Test{
@Autowired //自動注入
private UserManagerService userManagerService;
@Test
@Transactional //標(biāo)明此方法需使用事務(wù)
@Rollback(false) //標(biāo)明使用完此方法后事務(wù)不回滾,true時(shí)為回滾
public void testUser(){
System.out.println("測試Spring整合Junit4進(jìn)行單元測試");
AdeUser user = userManagerService.get("0");
System.out.println(user);
System.out.println("------------"+user.getLoginName());
}
}
- 使用Spring Test 可以使用@Autowired 自動注入 相關(guān)的bean信息,而不需要自己手動通過getBean去獲取相應(yīng)的bean信息。
- @Transaction
- 使用Spring Test 測試,可以 @Transaction 注解,表示該方法使用spring的事務(wù)。
- @Rollback(false)
標(biāo)明使用完此方法后事務(wù)不回滾,true時(shí)為回滾。
比如每次打包或提交時(shí),都執(zhí)行下所有的測試類,而測試類每次都進(jìn)行插入或刪除數(shù)據(jù)或?qū)е聰?shù)據(jù)庫中的數(shù)據(jù)不完整,為了防止執(zhí)行測試類都修改庫中的數(shù)據(jù),可以設(shè)置Rollback(true)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解
今天小編就為大家分享一篇關(guān)于Java算法實(shí)現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01
深入淺出講解Spring框架中AOP及動態(tài)代理的應(yīng)用
在軟件業(yè),AOP為Aspect?Oriented?Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期間動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)2022-03-03
Dubbo Service Mesh基礎(chǔ)架構(gòu)組件改造
Service Mesh這個(gè)“熱”詞是2016年9月被“造”出來,而今年2018年更是被稱為service Mesh的關(guān)鍵之年,各家大公司都希望能在這個(gè)思潮下領(lǐng)先一步2023-03-03
SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼
這篇文章主要介紹了SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
Java如何將Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了Java將Excel數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
淺談web服務(wù)器項(xiàng)目中request請求和response的相關(guān)響應(yīng)處理
這篇文章主要介紹了淺談web服務(wù)器項(xiàng)目中request請求和response的相關(guān)響應(yīng)處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
淺析Java如何在并發(fā)環(huán)境下生成一個(gè)只讀的map
這篇文章主要為大家詳細(xì)介紹了Java如何在并發(fā)環(huán)境下生成一個(gè)只讀的map,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04

