91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Springboot中利用Mybatis-Plus實現一個單元測試功能

發布時間:2020-12-23 14:26:23 來源:億速云 閱讀:603 作者:Leah 欄目:開發技術

這篇文章給大家介紹如何在Springboot中利用Mybatis-Plus實現一個單元測試功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

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

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

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

1. 數據庫樣例和環境

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

如何在Springboot中利用Mybatis-Plus實現一個單元測試功能

圖1.1 用戶表ER圖

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

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

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: 123456

4. 方式三:只啟動數據庫環境+本地數據庫

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

  • 我們去掉@AutoConfigureTestDatabas注解,直接啟動測試嵌入式數據庫即可,在這里我們選用H2內存數據庫,首先在pom中引入H2 database maven依賴;

  • 然后后在test環境下引入sechema.sql文件,這個文件是用來初始化數據庫的,核心是創建表格語句;

  • 最后去掉這個頁面以后寫法和方式二一樣,在這里就不給出

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

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
@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)是關鍵,它關閉了自動配置,而一般在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注解表明使用的是內存數據庫而不是真實數據庫

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

6. 總結

如何在Springboot中利用Mybatis-Plus實現一個單元測試功能

圖6.1 三種數據庫單測總結

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

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

關于如何在Springboot中利用Mybatis-Plus實現一個單元測試功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣城市| 施秉县| 大宁县| 安多县| 怀宁县| 乌拉特中旗| 镇原县| 凤凰县| 太仓市| 建昌县| 七台河市| 申扎县| 淅川县| 灵石县| 盐山县| 普安县| 安新县| 炎陵县| 黔西县| 芷江| 衡山县| 垫江县| 内丘县| 凌海市| 宝清县| 沂水县| 漳州市| 葫芦岛市| 靖安县| 岳池县| 湘乡市| 诏安县| 东至县| 泽普县| 城口县| 大石桥市| 湾仔区| 舟山市| 图木舒克市| 商南县| 惠来县|