久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Springboot Mybatis-Plus數(shù)據(jù)庫單元測(cè)試實(shí)戰(zhàn)(三種方式)

瀏覽:6日期:2023-04-02 08:56:59

  單元測(cè)試長久以來是熱門話題,本文不會(huì)討論需不需要寫單測(cè),可以看看參考資料1,我個(gè)人認(rèn)為寫好單測(cè)應(yīng)該是每個(gè)優(yōu)秀開發(fā)者必備的技能,關(guān)于寫單測(cè)的好處在這里我就不展開討論了,快速進(jìn)入本文著重討論的話題,如何寫好數(shù)據(jù)庫單測(cè)。

  為什么要寫數(shù)據(jù)庫單測(cè)? 相信大家是不是有這樣類似的經(jīng)歷,在寫完復(fù)雜的sql語句后,自信滿滿的提測(cè),發(fā)現(xiàn)很大一部分Bug都是因?yàn)閟ql語句出現(xiàn)問題了,要么少寫逗號(hào),要么漏了字段,悔不當(dāng)初哇,為啥寫完不多測(cè)測(cè)呢!

  沒關(guān)系!這就教你如何寫數(shù)據(jù)庫單測(cè),讓你輕松告別數(shù)據(jù)庫相關(guān)bug。

1. 數(shù)據(jù)庫樣例和環(huán)境

  我們以用戶表為例開啟本次教程:

Springboot Mybatis-Plus數(shù)據(jù)庫單元測(cè)試實(shí)戰(zhàn)(三種方式)

圖1.1 用戶表ER圖

  引入mybatis-plus插件后,mapper類如下:

@Mapperpublic interface UserMapper extends BaseMapper<UserDO> {}

  整體環(huán)境:

spring boot: 1.5.18.RELEASE mybatis: 3.5.1 mybatis plus:3.4.0(此時(shí)最新版本,我們會(huì)用到最新版本的特性)

  在這里我們直接測(cè)試的是mybatis plus提供的一些CRUD,當(dāng)然這些CRUD一般都不會(huì)錯(cuò),實(shí)際項(xiàng)目中我們只需對(duì)自定義的SQL進(jìn)行單元測(cè)試即可。

2. 方式一:?jiǎn)?dòng)整個(gè)環(huán)境

  這種方式應(yīng)該是日常環(huán)境使用最多的,利用SpringBoot自1.4.0版本開始引入的@SpringBootTest注解可以啟動(dòng)我們單元測(cè)試所需要的所有環(huán)境,當(dāng)然,如果你項(xiàng)目中運(yùn)用了其他分布式服務(wù),他同樣也會(huì)啟動(dòng)這些服務(wù)。單測(cè)代碼如下:

@RunWith(SpringRunner.class)@SpringBootTestpublic 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è)置需要啟動(dòng)加載的類,按需加載

3. 方式二:只啟動(dòng)數(shù)據(jù)庫環(huán)境+遠(yuǎn)程數(shù)據(jù)庫

  在參考資料2中,最新的mybatis-plus發(fā)布版本(3.4.0)中引入了test starter,如圖:

Springboot Mybatis-Plus數(shù)據(jù)庫單元測(cè)試實(shí)戰(zhàn)(三種方式)

圖3.1 Mybatis-plus3.4.0引入test模塊

  模塊引入了新的注解@MybatisPlusTest,這個(gè)注解可以幫助我們只啟動(dòng)特定特定的模塊,直接上單測(cè)代碼:

@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); }}

  是不是很輕松?不過我們要注意如下幾點(diǎn)關(guān)鍵點(diǎn):

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)的作用是使用自定義的數(shù)據(jù)源,而非使用自動(dòng)配置的嵌入式內(nèi)存數(shù)據(jù)源 如果你在項(xiàng)目正在使用類似于druid的連接池,在test模塊的時(shí)候需要在application配置文件里面直接使用jdbc數(shù)據(jù)源即可,因?yàn)锧MybatisPlusTest注解不會(huì)啟動(dòng)連接池框架,典型的配置文件application.yml如下:

spring: datasource: url: jdbc:mysql://xxx.xxx.1.110:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8 username: root password: 1234564. 方式三:只啟動(dòng)數(shù)據(jù)庫環(huán)境+本地?cái)?shù)據(jù)庫

  在方式二的基礎(chǔ)上,進(jìn)行如下步驟:

我們?nèi)サ鬇AutoConfigureTestDatabas注解,直接啟動(dòng)測(cè)試嵌入式數(shù)據(jù)庫即可,在這里我們選用H2內(nèi)存數(shù)據(jù)庫,首先在pom中引入H2 database maven依賴; 然后后在test環(huán)境下引入sechema.sql文件,這個(gè)文件是用來初始化數(shù)據(jù)庫的,核心是創(chuàng)建表格語句; 最后去掉這個(gè)頁面以后寫法和方式二一樣,在這里就不給出

注意: sechema.sql文件要符合嵌入式數(shù)據(jù)庫的語法,在本例中為h2數(shù)據(jù)庫,如果你正在使用mysql數(shù)據(jù)庫,則需要把mysql的數(shù)據(jù)庫語法轉(zhuǎn)換為h2的數(shù)據(jù)庫語法。

5. @MybatisPlusTest注解原理

  如果你之前使用過MyBatis-Spring-Boot-Starter-Test中的@MybatisTest(參考資料3)的話,你會(huì)發(fā)現(xiàn)@MybatisPlusTest注解原理與之類似,都是限制spring boot的自動(dòng)配置(參考資料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@ImportAutoConfigurationpublic @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)閉了自動(dòng)配置,而一般在spring boot項(xiàng)目中enable是開啟的;

@AutoConfigureMybatisPlus注解是自定義注解,這個(gè)注解定義了加載所有所需的加載類,在spring.factories里面聲明了要自動(dòng)配置的類:

# AutoConfigureMybatis auto-configuration importscom.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í)數(shù)據(jù)庫

  有了這些限制和規(guī)定以后,mybatis-plus在測(cè)試環(huán)境內(nèi)就可以自動(dòng)加載所需要的的配置了,這樣就去除了非必要資源的加載。

6. 總結(jié)

Springboot Mybatis-Plus數(shù)據(jù)庫單元測(cè)試實(shí)戰(zhàn)(三種方式)

圖6.1 三種數(shù)據(jù)庫單測(cè)總結(jié)

  如果你正在使用mysql數(shù)據(jù)庫,我推薦使用方式二。如果你能解決mysq語法轉(zhuǎn)h2的問題,推薦使用方式三,這樣在離線的情況也可以進(jìn)行單測(cè),不需要連接遠(yuǎn)程數(shù)據(jù)庫。

PS:如果你有好的工具來完成mysql轉(zhuǎn)換h2的話可以在評(píng)論區(qū)里面推薦一下,我這邊找了好久,包括自定義寫轉(zhuǎn)換、一些專業(yè)工具等,感覺對(duì)navicat導(dǎo)出的語句作轉(zhuǎn)換不是很好好用。

7.參考資料

[1] 你真的需要單元測(cè)試嗎?[2] Mybatis-Plus發(fā)布版本[3] MyBatis-Spring-Boot-Starter-Test[4] SpringBoot四大神器之a(chǎn)uto-configuration

到此這篇關(guān)于Springboot Mybatis-Plus數(shù)據(jù)庫單元測(cè)試實(shí)戰(zhàn)(三種方式)的文章就介紹到這了,更多相關(guān)Springboot Mybatis-Plus單元測(cè)試內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产97色在线 | 亚洲 | 91国内视频在线观看 | 夜本色 | 国产在亚洲 线视频播放 | 中文字幕日韩一区二区三区 | 亚洲人视频 | ririsao久久精品一区 | 天天摸天天操 | 国产偷久久9977 | 一区二区三区四区av | 亚洲a级在线观看 | 色黄视频在线看 | 久草免费在线 | 色噜噜一区二区 | 精品一区国产 | 日韩精品在线一区 | 在线一区二区三区 | 日日天天 | 亚洲国产精品久久久久久女王 | 亚洲女人的天堂 | 亚洲一区二区三区四区 | 精品国产一区二区三区性色av | 日韩综合网 | 国产91色| 青青久在线视频 | 激情91| 国产精品久久婷婷六月丁香 | 日韩中文字幕在线播放 | 欧美日韩国产精品一区 | 伊人激情影院 | 狠狠色综合色综合网络 | 国产精品美女久久久久久久久久久 | 欧美成人精品一区二区男人看 | 看毛片网站 | 黑人巨大精品欧美一区二区小视频 | 一区二区三区四区免费观看 | 中文字幕在线永久 | 福利视频二区 | 欧美一区二区三区电影 | 蜜臀影院 | 君岛美绪一区二区三区在线视频 |