基于Springboot+Mybatis對(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)方式

- 修改
spring.factories添加MapperAutoConfiguration

- 使用自定義測(cè)試注解
@MapperTest

雖然這里有insert語(yǔ)句,但是測(cè)試結(jié)束,數(shù)據(jù)不會(huì)真的插入到表中,因?yàn)?code>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è)試。
到此這篇關(guān)于基于Springboot+Mybatis對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試的方式分享的文章就介紹到這了,更多相關(guān)Springboot+Mybatis對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
阿里云主機(jī)上安裝jdk 某庫(kù)出現(xiàn)問(wèn)題的解決方法
今天安裝jdk到阿里云服務(wù)上,首先看下阿里云是32位還是64位的,如果是32位下載32位的包,如果是64位的下載64位的包,下面與大家分享下安裝過(guò)程中遇到問(wèn)題的解決方法2013-06-06
Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:樸素字符匹配 Brute Force
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:樸素字符匹配 Brute Force,本文直接給出實(shí)例代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06
SpringBoot+LayIM+t-io 實(shí)現(xiàn)好友申請(qǐng)通知流程
這篇文章主要介紹了 SpringBoot+LayIM+t-io 實(shí)現(xiàn)好友申請(qǐng)通知流程,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-12-12
SpringData JPA中@OneToMany和@ManyToOne的用法詳解
這篇文章主要介紹了SpringData JPA中@OneToMany和@ManyToOne的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
一文教你掌握J(rèn)ava如何實(shí)現(xiàn)判空
實(shí)際項(xiàng)目中我們會(huì)有很多地方需要判空校驗(yàn),如果不做判空校驗(yàn)則可能產(chǎn)生NullPointerException異常。所以本文小編為大家整理了Java中幾個(gè)常見(jiàn)的判空方法,希望對(duì)大家有所幫助2023-04-04
Java中策略設(shè)計(jì)模式的實(shí)現(xiàn)及應(yīng)用場(chǎng)景
策略設(shè)計(jì)模式是Java中一種常用的設(shè)計(jì)模式,它通過(guò)定義一系列算法并將其封裝成獨(dú)立的策略類(lèi),從而使得算法可以在不影響客戶(hù)端的情況下隨時(shí)切換。策略設(shè)計(jì)模式主要應(yīng)用于系統(tǒng)中存在多種相似的算法、需要靈活調(diào)整算法邏輯或者需要擴(kuò)展新的算法等場(chǎng)景2023-04-04
Java利用httpclient通過(guò)get、post方式調(diào)用https接口的方法
這篇文章主要介紹了Java利用httpclient通過(guò)get、post方式調(diào)用https接口的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
SpringBoot項(xiàng)目jar發(fā)布后如何獲取jar包所在目錄路徑
這篇文章主要介紹了SpringBoot項(xiàng)目jar發(fā)布后如何獲取jar包所在目錄路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

