詳解Junit 測試之 Spring Test
在做spring相關測試時比較麻煩,如果只用JUnit測試,需要沒測有初始化一下applicationContext,效率比較底下,而且也有不足之處。
1、導致多次Spring容器初始化問題
根據(jù)JUnit測試方法的調(diào)用流程,每執(zhí)行一個測試方法都會創(chuàng)建一個測試用例的實例并調(diào)用setUp()方法。由于一般情況下,我們在setUp()方法 中初始化Spring容器,這意味著如果測試用例有多少個測試方法,Spring容器就會被重復初始化多次。雖然初始化Spring容器的速度并不會太 慢,但由于可能會在Spring容器初始化時執(zhí)行加載Hibernate映射文件等耗時的操作,如果每執(zhí)行一個測試方法都必須重復初始化Spring容 器,則對測試性能的影響是不容忽視的;使用Spring測試套件,Spring容器只會初始化一次!
2、需要使用硬編碼方式手工獲取Bean
在測試用例類中我們需要通過ctx.getBean()方法從Spirng容器中獲取需要測試的目標Bean,并且還要進行強制類型轉換的造型操作。這種乏味的操作迷漫在測試用例的代碼中,讓人覺得煩瑣不堪;使用Spring測試套件,測試用例類中的屬性會被自動填充Spring容器的對應Bean,無須在手工設置Bean!
3、數(shù)據(jù)庫現(xiàn)場容易遭受破壞
測試方法對數(shù)據(jù)庫的更改操作會持久化到數(shù)據(jù)庫中。雖然是針對開發(fā)數(shù)據(jù)庫進行操作,但如果數(shù)據(jù)操作的影響是持久的,可能會影響到后面的測試行為。舉個例子, 用戶在測試方法中插入一條ID為1的User記錄,第一次運行不會有問題,第二次運行時,就會因為主鍵沖突而導致測試用例失敗。所以應該既能夠完成功能邏 輯檢查,又能夠在測試完成后恢復現(xiàn)場,不會留下“后遺癥”;使用Spring測試套件,Spring會在你驗證后,自動回滾對數(shù)據(jù)庫的操作,保證數(shù)據(jù)庫的現(xiàn)場不被破壞,因此重復測試不會發(fā)生問題!
4、不方便對數(shù)據(jù)操作正確性進行檢查
假如我們向登錄日志表插入了一條成功登錄日志,可是我們卻沒有對t_login_log表中是否確實添加了一條記錄進行檢查。一般情況下,我們可能是打開 數(shù)據(jù)庫,肉眼觀察 是否插入了相應的記錄,但這嚴重違背了自動測試的原則。試想在測試包括成千上萬個數(shù)據(jù)操作行為的程序時,如何用肉眼進行檢查?
只要你繼承Spring的測試套件的用例類,你就可以通過jdbcTemplate在同一事務中訪問數(shù)據(jù)庫,查詢數(shù)據(jù)的變化,驗證操作的正確性!
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 的基類,該類主要用來加載配置文件,設置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進行測試 @ContextConfiguration(locations={"classpath:spring.xml","classpath:spring-mvc.xml","classpath:spring-hibernate.xml","classpath:spring-ehcache.xml"}) //加載配置文件 @WebAppConfiguration("src/main/webapp") //------------如果加入以下代碼,所有繼承該類的測試類都會遵循該配置,也可以不加,在測試類的方法上///控制事務,參見下一個實例 //這個非常關鍵,如果不加入這個注解配置,事務控制就會完全失效! //@Transactional //這里的事務關聯(lián)到配置文件中的事務控制器(transactionManager = "transactionManager"),同時//指定自動回滾(defaultRollback = true)。這樣做操作的數(shù)據(jù)才不會污染數(shù)據(jù)庫! //@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) //------------ public class BaseJunit4Test{ }
- @RunWith(SpringJUnit4ClassRunner.class) 使用junit4進行測試
- @ContextConfiguration() 加載spring相關的配置文件
- @WebAppConfiguration() 設置web項目的環(huán)境,如果是Web項目,必須配置該屬性,否則無法獲取 web 容器相關的信息(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 //標明此方法需使用事務 @Rollback(false) //標明使用完此方法后事務不回滾,true時為回滾 public void testUser(){ System.out.println("測試Spring整合Junit4進行單元測試"); AdeUser user = userManagerService.get("0"); System.out.println(user); System.out.println("------------"+user.getLoginName()); } }
- 使用Spring Test 可以使用@Autowired 自動注入 相關的bean信息,而不需要自己手動通過getBean去獲取相應的bean信息。
- @Transaction
- 使用Spring Test 測試,可以 @Transaction 注解,表示該方法使用spring的事務。
- @Rollback(false)
標明使用完此方法后事務不回滾,true時為回滾。
比如每次打包或提交時,都執(zhí)行下所有的測試類,而測試類每次都進行插入或刪除數(shù)據(jù)或?qū)е聰?shù)據(jù)庫中的數(shù)據(jù)不完整,為了防止執(zhí)行測試類都修改庫中的數(shù)據(jù),可以設置Rollback(true)。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot項目 文件上傳臨時目標被刪除異常的處理方案
這篇文章主要介紹了SpringBoot項目 文件上傳臨時目標被刪除異常的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot2.1.x,創(chuàng)建自己的spring-boot-starter自動配置模塊操作
這篇文章主要介紹了SpringBoot2.1.x,創(chuàng)建自己的spring-boot-starter自動配置模塊操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09