您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何在Springboot中利用Mybatis-Plus實現(xiàn)一個單元測試功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
??單元測試長久以來是熱門話題,本文不會討論需不需要寫單測,可以看看參考資料1,我個人認(rèn)為寫好單測應(yīng)該是每個優(yōu)秀開發(fā)者必備的技能,關(guān)于寫單測的好處在這里我就不展開討論了,快速進(jìn)入本文著重討論的話題,如何寫好數(shù)據(jù)庫單測。
??為什么要寫數(shù)據(jù)庫單測? 相信大家是不是有這樣類似的經(jīng)歷,在寫完復(fù)雜的sql語句后,自信滿滿的提測,發(fā)現(xiàn)很大一部分Bug都是因為sql語句出現(xiàn)問題了,要么少寫逗號,要么漏了字段,悔不當(dāng)初哇,為啥寫完不多測測呢!
??沒關(guān)系!這就教你如何寫數(shù)據(jù)庫單測,讓你輕松告別數(shù)據(jù)庫相關(guān)bug。
??我們以用戶表為例開啟本次教程:
圖1.1 用戶表ER圖
??引入mybatis-plus插件后,mapper類如下:
@Mapper public interface UserMapper extends BaseMapper<UserDO> { }
??整體環(huán)境:
spring boot: 1.5.18.RELEASE
mybatis: 3.5.1
mybatis plus:3.4.0(此時最新版本,我們會用到最新版本的特性)
??在這里我們直接測試的是mybatis plus提供的一些CRUD,當(dāng)然這些CRUD一般都不會錯,實際項目中我們只需對自定義的SQL進(jìn)行單元測試即可。
??這種方式應(yīng)該是日常環(huán)境使用最多的,利用SpringBoot自1.4.0版本開始引入的@SpringBootTest注解可以啟動我們單元測試所需要的所有環(huán)境,當(dāng)然,如果你項目中運用了其他分布式服務(wù),他同樣也會啟動這些服務(wù)。單測代碼如下:
@RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testCurd() { UserDO userDO = new UserDO(); userDO.setId(7777L); userDO.setGmtModified(new Date()); userDO.setGmtCreate(new Date()); userDO.setRealName("ke"); userDO.setUserName("ni"); userMapper.insert(userDO); UserDO select = userMapper.selectById(1); System.out.println(select); } }
@SpringBootTest注解可以設(shè)置需要啟動加載的類,按需加載
??在參考資料2中,最新的mybatis-plus發(fā)布版本(3.4.0)中引入了test starter,如圖:
圖3.1 Mybatis-plus3.4.0引入test模塊
??模塊引入了新的注解@MybatisPlusTest
,這個注解可以幫助我們只啟動特定特定的模塊,直接上單測代碼:
@RunWith(SpringRunner.class) @MybatisPlusTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testCurd() { UserDO userDO = new UserDO(); userDO.setId(7777L); userDO.setGmtModified(new Date()); userDO.setGmtCreate(new Date()); userDO.setRealName("ke"); userDO.setUserName("ni"); userMapper.insert(userDO); UserDO select = userMapper.selectById(1); System.out.println(select); } }
??是不是很輕松?不過我們要注意如下幾點關(guān)鍵點:
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
的作用是使用自定義的數(shù)據(jù)源,而非使用自動配置的嵌入式內(nèi)存數(shù)據(jù)源
如果你在項目正在使用類似于druid的連接池,在test模塊的時候需要在application配置文件里面直接使用jdbc數(shù)據(jù)源即可,因為@MybatisPlusTest
注解不會啟動連接池框架,典型的配置文件application.yml如下:
spring: datasource: url: jdbc:mysql://xxx.xxx.1.110:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8 username: root password: 123456
??在方式二的基礎(chǔ)上,進(jìn)行如下步驟:
我們?nèi)サ?code>@AutoConfigureTestDatabas注解,直接啟動測試嵌入式數(shù)據(jù)庫即可,在這里我們選用H2內(nèi)存數(shù)據(jù)庫,首先在pom中引入H2 database maven依賴;
然后后在test環(huán)境下引入sechema.sql文件,這個文件是用來初始化數(shù)據(jù)庫的,核心是創(chuàng)建表格語句;
最后去掉這個頁面以后寫法和方式二一樣,在這里就不給出
注意: sechema.sql文件要符合嵌入式數(shù)據(jù)庫的語法,在本例中為h3數(shù)據(jù)庫,如果你正在使用mysql數(shù)據(jù)庫,則需要把mysql的數(shù)據(jù)庫語法轉(zhuǎn)換為h3的數(shù)據(jù)庫語法。
??如果你之前使用過MyBatis-Spring-Boot-Starter-Test中的@MybatisTest
(參考資料3)的話,你會發(fā)現(xiàn)@MybatisPlusTest
注解原理與之類似,都是限制spring boot的自動配置(參考資料4),只需要加載特定的配置即可。我們來看一下注解源碼:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @BootstrapWith(MybatisPlusTestContextBootstrapper.class) @ExtendWith({SpringExtension.class}) @OverrideAutoConfiguration( enabled = false ) @TypeExcludeFilters({MybatisPlusTypeExcludeFilter.class}) @Transactional @AutoConfigureCache @AutoConfigureMybatisPlus @AutoConfigureTestDatabase @ImportAutoConfiguration public @interface MybatisPlusTest { String[] properties() default {}; boolean useDefaultFilters() default true; Filter[] includeFilters() default {}; Filter[] excludeFilters() default {}; @AliasFor( annotation = ImportAutoConfiguration.class, attribute = "exclude" ) Class<?>[] excludeAutoConfiguration() default {}; }
@OverrideAutoConfiguration(enabled = false)
是關(guān)鍵,它關(guān)閉了自動配置,而一般在spring boot項目中enable是開啟的;
@AutoConfigureMybatisPlus
注解是自定義注解,這個注解定義了加載所有所需的加載類,在spring.factories里面聲明了要自動配置的類:
# AutoConfigureMybatis auto-configuration imports com.baomidou.mybatisplus.test.autoconfigure.AutoConfigureMybatisPlus=\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\ com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\ com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
@AutoConfigureTestDatabase
注解表明使用的是內(nèi)存數(shù)據(jù)庫而不是真實數(shù)據(jù)庫
??有了這些限制和規(guī)定以后,mybatis-plus在測試環(huán)境內(nèi)就可以自動加載所需要的的配置了,這樣就去除了非必要資源的加載。
圖6.1 三種數(shù)據(jù)庫單測總結(jié)
??如果你正在使用mysql數(shù)據(jù)庫,我推薦使用方式二。如果你能解決mysq語法轉(zhuǎn)h3的問題,推薦使用方式三,這樣在離線的情況也可以進(jìn)行單測,不需要連接遠(yuǎn)程數(shù)據(jù)庫。
PS:如果你有好的工具來完成mysql轉(zhuǎn)換h3的話可以在評論區(qū)里面推薦一下,我這邊找了好久,包括自定義寫轉(zhuǎn)換、一些專業(yè)工具等,感覺對navicat導(dǎo)出的語句作轉(zhuǎn)換不是很好好用。
關(guān)于如何在Springboot中利用Mybatis-Plus實現(xiàn)一個單元測試功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。