电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Springboot Mybatis-Plus數據庫單元測試實戰(三種方式)

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

  單元測試長久以來是熱門話題,本文不會討論需不需要寫單測,可以看看參考資料1,我個人認為寫好單測應該是每個優秀開發者必備的技能,關于寫單測的好處在這里我就不展開討論了,快速進入本文著重討論的話題,如何寫好數據庫單測。

  為什么要寫數據庫單測? 相信大家是不是有這樣類似的經歷,在寫完復雜的sql語句后,自信滿滿的提測,發現很大一部分Bug都是因為sql語句出現問題了,要么少寫逗號,要么漏了字段,悔不當初哇,為啥寫完不多測測呢!

  沒關系!這就教你如何寫數據庫單測,讓你輕松告別數據庫相關bug。

1. 數據庫樣例和環境

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

Springboot Mybatis-Plus數據庫單元測試實戰(三種方式)

圖1.1 用戶表ER圖

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

@Mapperpublic interface UserMapper extends BaseMapper<UserDO> {}

  整體環境:

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

  在這里我們直接測試的是mybatis plus提供的一些CRUD,當然這些CRUD一般都不會錯,實際項目中我們只需對自定義的SQL進行單元測試即可。

2. 方式一:啟動整個環境

  這種方式應該是日常環境使用最多的,利用SpringBoot自1.4.0版本開始引入的@SpringBootTest注解可以啟動我們單元測試所需要的所有環境,當然,如果你項目中運用了其他分布式服務,他同樣也會啟動這些服務。單測代碼如下:

@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注解可以設置需要啟動加載的類,按需加載

3. 方式二:只啟動數據庫環境+遠程數據庫

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

Springboot Mybatis-Plus數據庫單元測試實戰(三種方式)

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

  是不是很輕松?不過我們要注意如下幾點關鍵點:

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

spring: datasource: url: jdbc:mysql://xxx.xxx.1.110:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8 username: root password: 1234564. 方式三:只啟動數據庫環境+本地數據庫

  在方式二的基礎上,進行如下步驟:

我們去掉@AutoConfigureTestDatabas注解,直接啟動測試嵌入式數據庫即可,在這里我們選用H2內存數據庫,首先在pom中引入H2 database maven依賴; 然后后在test環境下引入sechema.sql文件,這個文件是用來初始化數據庫的,核心是創建表格語句; 最后去掉這個頁面以后寫法和方式二一樣,在這里就不給出

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

5. @MybatisPlusTest注解原理

  如果你之前使用過MyBatis-Spring-Boot-Starter-Test中的@MybatisTest(參考資料3)的話,你會發現@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@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)是關鍵,它關閉了自動配置,而一般在spring boot項目中enable是開啟的;

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

# 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注解表明使用的是內存數據庫而不是真實數據庫

  有了這些限制和規定以后,mybatis-plus在測試環境內就可以自動加載所需要的的配置了,這樣就去除了非必要資源的加載。

6. 總結

Springboot Mybatis-Plus數據庫單元測試實戰(三種方式)

圖6.1 三種數據庫單測總結

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

PS:如果你有好的工具來完成mysql轉換h2的話可以在評論區里面推薦一下,我這邊找了好久,包括自定義寫轉換、一些專業工具等,感覺對navicat導出的語句作轉換不是很好好用。

7.參考資料

[1] 你真的需要單元測試嗎?[2] Mybatis-Plus發布版本[3] MyBatis-Spring-Boot-Starter-Test[4] SpringBoot四大神器之auto-configuration

到此這篇關于Springboot Mybatis-Plus數據庫單元測試實戰(三種方式)的文章就介紹到這了,更多相關Springboot Mybatis-Plus單元測試內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 四探针电阻率测试仪-振实密度仪-粉末流动性测定仪-宁波瑞柯微智能 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 车牌识别道闸_停车场收费系统_人脸识别考勤机_速通门闸机_充电桩厂家_中全清茂官网 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 西装定制/做厂家/公司_西装订做/制价格/费用-北京圣达信西装 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 儿童语言障碍训练-武汉优佳加感统文化发展有限公司 | 自清洗过滤器_全自动过滤器_全自动反冲洗过滤器_量子过滤器-滑漮滴 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 喷砂机厂家_自动除锈抛丸机价格-成都泰盛吉自动化喷砂设备 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 电动葫芦-河北悍象起重机械有限公司 | 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 | 船用泵,船用离心泵,船用喷射泵,泰州隆华船舶设备有限公司 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 酒万铺-酒水招商-酒水代理 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 网站优化公司_北京网站优化_抖音短视频代运营_抖音关键词seo优化排名-通则达网络 | 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 恒温恒湿箱(药品/保健品/食品/半导体/细菌)-兰贝石(北京)科技有限公司 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | 富森高压水枪-柴油驱动-养殖场高压清洗机-山东龙腾环保科技有限公司 | 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 工业插头-工业插头插座【厂家】-温州罗曼电气 | 玉米深加工设备-玉米深加工机械-新型玉米工机械生产厂家-河南粮院机械制造有限公司 | 溶氧传感器-pH传感器|哈美顿(hamilton) | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] |