SpringBoot @SpringBootTest加速單元測(cè)試的小訣竅
@SpringBootTest加速單元測(cè)試小訣竅
Pre
SpringBoot - 應(yīng)用程序測(cè)試方案
隨著代碼量的爭(zhēng)奪,測(cè)試類的啟動(dòng)速度變得越來(lái)越慢,而大多數(shù)情況下只是為了測(cè)試一下某個(gè)實(shí)現(xiàn)類的某個(gè)方法而已,比如測(cè)試一個(gè)DAO層的方法,卻要啟動(dòng)這個(gè)應(yīng)用。
今天我們繼續(xù)深入了解一下 稍微高級(jí)一點(diǎn)的用法
classes
classes 屬性用來(lái)指定運(yùn)行測(cè)試類需要裝載的 class 集合,如果不指定,那么會(huì)默認(rèn)裝載 @SpringBootConfiguration 注解標(biāo)注的類。
如果不指定classes屬性,那么啟動(dòng)測(cè)試類時(shí)需要加載的Bean的數(shù)量和正常啟動(dòng)一次入口類加載的 Bean 數(shù)量是一樣的。
如果你的項(xiàng)目中有很多個(gè) Bean, 特別是有以下幾種時(shí):
- 有 CommandLineRunner 的實(shí)現(xiàn)類
- 用 @PostConstruct 注解指定了初始化方法的類
這幾種類在程序初始化的過程中都會(huì)運(yùn)行自身的業(yè)務(wù)代碼或者初始化代碼,從而延后了測(cè)試方法的運(yùn)行。
在這種情況下,我們?cè)诰帉憸y(cè)試類的時(shí)候,如果明確這個(gè)測(cè)試類會(huì)用到哪幾個(gè) Bean,則可以在 classes 屬性處指定,之后啟動(dòng)測(cè)試類的時(shí)候,就只會(huì)加載需要的 Bean 到上下文中,從而加快啟動(dòng)速度。比如:
用法
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes={ArtisanServiceImpl.class})
webEnvironment
這個(gè)屬性的含義是說(shuō)測(cè)試類要不要啟動(dòng)一個(gè) web 環(huán)境, 要不要啟動(dòng)一個(gè) Tomcat 容器,可選的值為:
MOCK
:?jiǎn)?dòng)一個(gè)模擬的 Servlet 環(huán)境, 默認(rèn)值。RANDOM_PORT
:?jiǎn)?dòng)一個(gè) Tomcat 容器,并監(jiān)聽一個(gè)隨機(jī)的端口號(hào)DEFINED_PORT
:?jiǎn)?dòng)一個(gè) Tomcat 容器,并監(jiān)聽配置文件中定義的端口(未定義則默認(rèn)監(jiān)聽8080)NONE
:不啟動(dòng) Tomcat 容器
怎么使用呢? 舉個(gè)例子 如果你要測(cè)試的方法不需要用到 Tomcat 容器,比如:
- 測(cè)試 DAO 類的CRUD
- 測(cè)試Service 類的業(yè)務(wù)方法
- 測(cè)試工具類的公用方法
- 測(cè)試配置文件類是否讀取到了正確的值
- …
用法
只需要通過指定
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
即可達(dá)到加速的效果。這時(shí)測(cè)試類啟動(dòng)時(shí)就只會(huì)初始化 Spring 上下文,不再啟動(dòng) Tomcat 容器了:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) public class ArtisanServiceTests { @Autowired private IArtisanSerive artisanService; @Test public void test() { // ... } }
@記錄使用SpringBootTest遇到的坑
導(dǎo)入junit依賴,運(yùn)行會(huì)報(bào)錯(cuò)
這里變紅了,只需要spring-boot-starter-test依賴就好
刪掉junit依賴
運(yùn)行成功!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 使用@SpringBootTest注解進(jìn)行單元測(cè)試
- @SpringBootTest 注解報(bào)紅問題及解決
- SpringBoot使用@SpringBootTest注解開發(fā)單元測(cè)試教程
- 解決@SpringBootTest 單元測(cè)試遇到的坑
- 關(guān)于@SpringBootApplication與@SpringBootTest的區(qū)別及用法
- SpringBoot測(cè)試之@SpringBootTest與MockMvc的實(shí)戰(zhàn)應(yīng)用小結(jié)
- spring中@SpringBootTest注解的實(shí)現(xiàn)
相關(guān)文章
IDEA修改生成jar包名字的兩種方法實(shí)現(xiàn)
本文主要介紹了IDEA修改生成jar包名字的兩種方法實(shí)現(xiàn),通過簡(jiǎn)單的步驟,您可以修改項(xiàng)目名稱并在打包時(shí)使用新的名稱,具有一定的參考價(jià)值,感興趣的可以了解下2023-08-08Java使用StampedLock實(shí)現(xiàn)高效讀寫功能
StampedLock 是 Java 8 引入的高性能鎖,提供了三種鎖模式:寫鎖、悲觀讀鎖和樂觀讀鎖,與傳統(tǒng)的 ReentrantReadWriteLock 相比,StampedLock 更注重性能,特別適合讀多寫少的場(chǎng)景,所以本文給大家介紹了Java使用StampedLock實(shí)現(xiàn)高效讀寫功能,需要的朋友可以參考下2025-01-01Java基礎(chǔ)之finally語(yǔ)句與return語(yǔ)句詳解
這篇文章主要介紹了Java基礎(chǔ)之finally語(yǔ)句與return語(yǔ)句詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04springboot?去掉netflix?禁用Eureka的解決方法
這篇文章主要介紹了springboot?去掉netflix?禁用Eureka的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09Java+Nginx實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù)
本篇文章的內(nèi)容是介紹Java+Nginx如何實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù),步驟詳細(xì),思路清新,需要的朋友可以參考下2015-07-07Java基礎(chǔ)知識(shí)精通數(shù)組的內(nèi)存分析
數(shù)組對(duì)于每一門編程語(yǔ)言來(lái)說(shuō)都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語(yǔ)言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語(yǔ)言中提供的數(shù)組是用來(lái)存儲(chǔ)固定大小的同類型元素2022-04-04java8 stream自定義分組求和并排序的實(shí)現(xiàn)
這篇文章主要介紹了java8 stream自定義分組求和并排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01