SpringBoot對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試的方法詳解
Mybatis測(cè)試依賴(lài)
我們項(xiàng)目采用的 SpringBoot
+ Mybatis
作為開(kāi)發(fā)框架,大家第一想到可以用 SpringBoot
自帶的測(cè)試注解 @SpringBootTest
進(jìn)行測(cè)試。但是使用該注解有一個(gè)最大的弊端就是需要啟動(dòng)整個(gè)容器,注入全部的bean,那么一次測(cè)試就相當(dāng)于啟動(dòng)一次應(yīng)用,我們的應(yīng)用啟動(dòng)一次就要花費(fèi)近70~80秒,黃花菜都涼了。
那么有沒(méi)有更好的辦法,有必要注入全量的bean嗎?是不是只要注入數(shù)據(jù)訪問(wèn)層相關(guān)的bean即可,其實(shí)官方的 mybatis
就給了我們這樣的的解決方案。
引入依賴(lài) mybatis-spring-boot-starter-test
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter-test</artifactId> <version>2.3.0</version> <scope>test</scope> </dependency>
Mapper接口
@Mapper public interface CityMapper { @Select("SELECT * FROM CITY WHERE state = #{state}") City findByState(@Param("state") String state); }
使用junit5的測(cè)試類(lèi)
// 使用junit5 @MybatisTest // 使用真實(shí)的數(shù)據(jù)源進(jìn)行測(cè)試 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) public class CityMapperTest { @Autowired private CityMapper cityMapper; @Test public void findByStateTest() { City city = cityMapper.findByState("CA"); assertThat(city.getName()).isEqualTo("San Francisco"); assertThat(city.getState()).isEqualTo("CA"); assertThat(city.getCountry()).isEqualTo("US"); } }
自定義一個(gè)啟動(dòng)類(lèi)
@MybatisTest
在默認(rèn)情況下將會(huì)探測(cè)到帶有 @SpringBootApplication
的類(lèi)。 因此,由于 bean
定義的一些方法,可能會(huì)發(fā)生一些意想不到的錯(cuò)誤,或者一些不必要的組件被裝入 ApplicationContext
。 為了避免這種情況,我們可以在與測(cè)試類(lèi)相同的包中創(chuàng)建帶有 @SpringBootApplication
的類(lèi)。
package sample.mybatis.mapper; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication class MapperTestApplication { }
運(yùn)行結(jié)果
但是, 上面是使用原生mybatis的測(cè)試方式,而我們項(xiàng)目用的是基于mybatis封裝的開(kāi)源框架 tkMapper
, github
地址是 https://github.com/abel533/Mapper
,并不適用啊,無(wú)解,只能去看下 mybatis-spring-boot-starter-test
的原理。
實(shí)現(xiàn)原理
實(shí)際上 mybatis-spring-boot-starter-test
的實(shí)現(xiàn)原理很簡(jiǎn)單,代碼目錄結(jié)構(gòu)如下:
@MybatisTest
注解如下,引入 MybatisTestContextBootstrapper
測(cè)試引導(dǎo)程序。同時(shí)引入其他的注解,進(jìn)行自動(dòng)裝配。
@AutoConfigureMybatis
由 MybatisTest
注解引入,會(huì)去找 META-INF
下的 spring.factories
,自動(dòng)組裝mybatis相關(guān)的bean
那么基于目前的理解,我們也可以簡(jiǎn)單實(shí)現(xiàn)一個(gè)基于 TkMapper
的測(cè)試框架。
Mapper測(cè)試框架
我們參照 mybatis
原生的實(shí)現(xiàn)方式
重新命名,內(nèi)容不變
修改 spring.factories
添加 MapperAutoConfiguration
使用自定義測(cè)試注解 @MapperTest
雖然這里有 insert
語(yǔ)句,但是測(cè)試結(jié)束,數(shù)據(jù)不會(huì)真的插入到表中,因?yàn)?MapperTest
注解上包含了事務(wù)注解,所以是可以反復(fù)進(jìn)行測(cè)試的。
總結(jié)
本文分享了基于 springboot+mybatis
項(xiàng)目中針對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試的一種方式,這種方式只注入mybatis相關(guān)的bean,快速高效的對(duì)不同類(lèi)型的數(shù)據(jù)庫(kù)進(jìn)行測(cè)試,保證程序的正確性。
其實(shí),對(duì)于大多數(shù)據(jù)的程序員來(lái)說(shuō),寫(xiě)單元測(cè)試可能是一種負(fù)擔(dān)和累贅,但是如果你的單元測(cè)試真的能夠在你的項(xiàng)目中有其價(jià)值,那么就是值得的,千萬(wàn)不要為了單元測(cè)試而單元測(cè)試。
以上就是SpringBoot對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot對(duì)數(shù)據(jù)訪問(wèn)層測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 基于Springboot+Mybatis對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試的方式分享
- springboot數(shù)據(jù)訪問(wèn)和數(shù)據(jù)視圖的使用方式詳解
- SpringBoot實(shí)戰(zhàn)記錄之?dāng)?shù)據(jù)訪問(wèn)
- 深入了解Springboot核心知識(shí)點(diǎn)之?dāng)?shù)據(jù)訪問(wèn)配置
- SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問(wèn)的詳細(xì)過(guò)程
- SpringBoot數(shù)據(jù)訪問(wèn)自定義使用Druid數(shù)據(jù)源的方法
- SpringBoot+MyBatis簡(jiǎn)單數(shù)據(jù)訪問(wèn)應(yīng)用的實(shí)例代碼
- SpringBoot數(shù)據(jù)訪問(wèn)的實(shí)現(xiàn)
相關(guān)文章
Java多線(xiàn)程中Thread.currentThread()和this的區(qū)別詳解
這篇文章主要介紹了Java多線(xiàn)程中Thread.currentThread()和this的區(qū)別詳解,Thread.currentThread()方法返回的是對(duì)當(dāng)前正在執(zhí)行的線(xiàn)程對(duì)象的引用,this代表的是當(dāng)前調(diào)用它所在函數(shù)所屬的對(duì)象的引用,需要的朋友可以參考下2023-08-08Java?多線(xiàn)程并發(fā)編程提高數(shù)據(jù)處理效率的詳細(xì)過(guò)程
這篇文章主要介紹了Java?多線(xiàn)程并發(fā)編程提高數(shù)據(jù)處理效率,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問(wèn)題
這篇文章主要介紹了Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09java藍(lán)橋杯歷年真題及答案整理(小結(jié))
這篇文章主要介紹了java藍(lán)橋杯歷年真題及答案整理(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02IDEA無(wú)法打開(kāi)Marketplace的三種解決方案(推薦)
這篇文章主要介紹了IDEA無(wú)法打開(kāi)Marketplace的三種解決方案(推薦),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Spring AOP實(shí)現(xiàn)接口請(qǐng)求記錄到數(shù)據(jù)庫(kù)的示例代碼
這篇文章主要介紹了Spring AOP實(shí)現(xiàn)接口請(qǐng)求記錄到數(shù)據(jù)庫(kù),代碼包括引入AOP依賴(lài)及創(chuàng)建日志記錄表,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09