基于Springboot+Mybatis對數(shù)據(jù)訪問層進行單元測試的方式分享
Mybatis測試依賴
我們項目采用的SpringBoot
+ Mybatis
作為開發(fā)框架,大家第一想到可以用SpringBoot
自帶的測試注解@SpringBootTest
進行測試。但是使用該注解有一個最大的弊端就是需要啟動整個容器,注入全部的bean,那么一次測試就相當于啟動一次應用,我們的應用啟動一次就要花費近70~80秒,黃花菜都涼了。
那么有沒有更好的辦法,有必要注入全量的bean嗎?是不是只要注入數(shù)據(jù)訪問層相關的bean即可,其實官方的mybatis
就給了我們這樣的的解決方案。
- 引入依賴
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的測試類
// 使用junit5 @MybatisTest // 使用真實的數(shù)據(jù)源進行測試 @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"); } }
- 自定義一個啟動類
@MybatisTest
在默認情況下將會探測到帶有 @SpringBootApplication
的類。 因此,由于 bean
定義的一些方法,可能會發(fā)生一些意想不到的錯誤,或者一些不必要的組件被裝入 ApplicationContext
。 為了避免這種情況,我們可以在與測試類相同的包中創(chuàng)建帶有 @SpringBootApplication
的類。
package sample.mybatis.mapper; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication class MapperTestApplication { }
- 運行結(jié)果
但是, 上面是使用原生mybatis的測試方式,而我們項目用的是基于mybatis封裝的開源框架tkMapper
,github
地址是https://github.com/abel533/Mapper
,并不適用啊,無解,只能去看下mybatis-spring-boot-starter-test
的原理。
實現(xiàn)原理
實際上mybatis-spring-boot-starter-test
的實現(xiàn)原理很簡單,代碼目錄結(jié)構(gòu)如下:
@MybatisTest
注解如下,引入MybatisTestContextBootstrapper
測試引導程序。同時引入其他的注解,進行自動裝配。
@AutoConfigureMybatis
由MybatisTest
注解引入,會去找META-INF
下的spring.factories
,自動組裝mybatis相關的bean
那么基于目前的理解,我們也可以簡單實現(xiàn)一個基于TkMapper
的測試框架。
Mapper測試框架
- 我們參照
mybatis
原生的實現(xiàn)方式
- 修改
spring.factories
添加MapperAutoConfiguration
- 使用自定義測試注解
@MapperTest
雖然這里有insert
語句,但是測試結(jié)束,數(shù)據(jù)不會真的插入到表中,因為MapperTest
注解上包含了事務注解,所以是可以反復進行測試的。
總結(jié)
本文分享了基于springboot+mybatis
項目中針對數(shù)據(jù)訪問層進行單元測試的一種方式,這種方式只注入mybatis相關的bean,快速高效的對不同類型的數(shù)據(jù)庫進行測試,保證程序的正確性。
其實,對于大多數(shù)據(jù)的程序員來說,寫單元測試可能是一種負擔和累贅,但是如果你的單元測試真的能夠在你的項目中有其價值,那么就是值得的,千萬不要為了單元測試而單元測試。
到此這篇關于基于Springboot+Mybatis對數(shù)據(jù)訪問層進行單元測試的方式分享的文章就介紹到這了,更多相關Springboot+Mybatis對數(shù)據(jù)訪問層進行單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java數(shù)據(jù)結(jié)構(gòu)及算法實例:樸素字符匹配 Brute Force
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實例:樸素字符匹配 Brute Force,本文直接給出實例代碼,代碼中包含詳細注釋,需要的朋友可以參考下2015-06-06SpringBoot+LayIM+t-io 實現(xiàn)好友申請通知流程
這篇文章主要介紹了 SpringBoot+LayIM+t-io 實現(xiàn)好友申請通知流程,本文圖文并茂給大家介紹的非常詳細,需要的朋友可以參考下2017-12-12SpringData JPA中@OneToMany和@ManyToOne的用法詳解
這篇文章主要介紹了SpringData JPA中@OneToMany和@ManyToOne的用法詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java利用httpclient通過get、post方式調(diào)用https接口的方法
這篇文章主要介紹了Java利用httpclient通過get、post方式調(diào)用https接口的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02SpringBoot項目jar發(fā)布后如何獲取jar包所在目錄路徑
這篇文章主要介紹了SpringBoot項目jar發(fā)布后如何獲取jar包所在目錄路徑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11