最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年12月23日 10:49:40   作者:CuteXiaoKe  
這篇文章主要介紹了Springboot Mybatis-Plus數(shù)據(jù)庫單元測試實戰(zhàn)(三種方式),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(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. 數(shù)據(jù)庫樣例和環(huán)境

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

用戶表

圖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)行單元測試即可。

2. 方式一:啟動整個環(huá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è)置需要啟動加載的類,按需加載

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

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

Mybatis-plus3.4.0新特性

圖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

4. 方式三:只啟動數(shù)據(jù)庫環(huán)境+本地數(shù)據(jù)庫

  在方式二的基礎(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ù)庫的語法,在本例中為h2數(shù)據(jù)庫,如果你正在使用mysql數(shù)據(jù)庫,則需要把mysql的數(shù)據(jù)庫語法轉(zhuǎn)換為h2的數(shù)據(jù)庫語法。

5. @MybatisPlusTest注解原理

  如果你之前使用過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. 總結(jié)

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

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

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

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

7.參考資料

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

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

相關(guān)文章

  • Java使用RedisTemplate模糊刪除key操作

    Java使用RedisTemplate模糊刪除key操作

    這篇文章主要介紹了Java使用RedisTemplate模糊刪除key操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Spring boot 配置多個redis的方法示例

    Spring boot 配置多個redis的方法示例

    這篇文章主要介紹了Spring boot 配置多個redis的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • SpringBoot實現(xiàn)指標(biāo)監(jiān)控

    SpringBoot實現(xiàn)指標(biāo)監(jiān)控

    這篇文章主要介紹了SpringBoot實現(xiàn)指標(biāo)監(jiān)控方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java遞歸運行的機制:遞歸的微觀解讀圖文分析

    Java遞歸運行的機制:遞歸的微觀解讀圖文分析

    這篇文章主要介紹了Java遞歸運行的機制:遞歸的微觀解讀,結(jié)合圖文形式詳細(xì)分析了java遞歸運行的原理、機制與相關(guān)注意事項,需要的朋友可以參考下
    2020-03-03
  • Java getResource()如何獲取class文件目錄位置

    Java getResource()如何獲取class文件目錄位置

    這篇文章主要介紹了Java getResource()如何獲取class文件目錄位置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java簡單實現(xiàn)調(diào)用命令行并獲取執(zhí)行結(jié)果示例

    Java簡單實現(xiàn)調(diào)用命令行并獲取執(zhí)行結(jié)果示例

    這篇文章主要介紹了Java簡單實現(xiàn)調(diào)用命令行并獲取執(zhí)行結(jié)果,結(jié)合實例形式分析了Java調(diào)用ping命令并獲取執(zhí)行結(jié)果相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • 詳解SpringMVC中的日期處理和文件上傳操作

    詳解SpringMVC中的日期處理和文件上傳操作

    這篇文章主要為大家詳細(xì)介紹了SpringMVC中的日期處理和文件上傳操作方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定借鑒價值,需要的可以參考一下
    2022-08-08
  • springboot+mybatis+redis 二級緩存問題實例詳解

    springboot+mybatis+redis 二級緩存問題實例詳解

    Mybatis默認(rèn)沒有開啟二級緩存,需要在全局配置(mybatis-config.xml)中開啟二級緩存。本文講述的是使用Redis作為緩存,與springboot、mybatis進(jìn)行集成的方法。需要的朋友參考下吧
    2017-12-12
  • Spring實戰(zhàn)之使用ClassPathResource加載xml資源示例

    Spring實戰(zhàn)之使用ClassPathResource加載xml資源示例

    這篇文章主要介紹了Spring實戰(zhàn)之使用ClassPathResource加載xml資源,結(jié)合實例形式分析了Spring使用ClassPathResource加載xml資源的具體實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • java中Webclient對象如何解析400狀態(tài)碼詳解

    java中Webclient對象如何解析400狀態(tài)碼詳解

    這篇文章主要介紹了java中Webclient對象如何解析400狀態(tài)碼的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-12-12

最新評論

奉化市| 大城县| 玛曲县| 新郑市| SHOW| 布尔津县| 壶关县| 凉城县| 莱西市| 玉山县| 叶城县| 昂仁县| 西乌珠穆沁旗| 天长市| 山阳县| 扬州市| 靖边县| 鄂伦春自治旗| 阜康市| 平阴县| 佳木斯市| 古蔺县| 司法| 六安市| 望江县| 电白县| 明星| 苏尼特左旗| 马公市| 泰宁县| 信宜市| 武功县| 海门市| 三门县| 衡东县| 石首市| 北辰区| 金昌市| 万州区| 武隆县| 喜德县|