成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot中如何對數據訪問層進行單元測試?

開發 項目管理
本文分享了基于springboot+mybatis項目中針對數據訪問層進行單元測試的一種方式,這種方式只注入mybatis相關的bean,快速高效的對不同類型的數據庫進行測試,保證程序的正確性。

前言

我們公司作為一個面向銀行、金融機構的TO B類企業,頻繁遇到各個甲方爸爸提出的國產化數據庫的改造需求,包括OceanBase, TiDB,geldenDB等等。每次適配都需要投入大量的人力進行測試工作,那么有沒有更高效、低成本的方式去解決這個問題呢?本文就介紹一種快高效、可復用的解決方案——對數據訪問層做單元測試。

Mybatis測試依賴

我們項目采用的SpringBoot + Mybatis作為開發框架,大家第一想到可以用SpringBoot自帶的測試注解@SpringBootTest進行測試。但是使用該注解有一個最大的弊端就是需要啟動整個容器,注入全部的bean,那么一次測試就相當于啟動一次應用,我們的應用啟動一次就要花費近70~80秒,黃花菜都涼了。

圖片圖片

那么有沒有更好的辦法,有必要注入全量的bean嗎?是不是只要注入數據訪問層相關的bean即可,其實官方的mybatis就給了我們這樣的的解決方案。

  1. 引入依賴mybatis-spring-boot-starter-test
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter-test</artifactId>
  <version>2.3.0</version>
  <scope>test</scope>
</dependency>
  1. Mapper接口
@Mapper
public interface CityMapper {

    @Select("SELECT * FROM CITY WHERE state = #{state}")
    City findByState(@Param("state") String state);

}
  1. 使用junit5的測試類
// 使用junit5
@MybatisTest
// 使用真實的數據源進行測試
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class CityMapperTest {

    @Autowired
    private CityMapper cityMapper;

    @Test
    public void findByStateTest() {
        City city = cityMapper.findByState("CA");
        assertThat(city.getName()).isEqualTo("San Francisco");
        assertThat(city.getState()).isEqualTo("CA");
        assertThat(city.getCountry()).isEqualTo("US");
    }

}
  1. 自定義一個啟動類

@MybatisTest在默認情況下將會探測到帶有 @SpringBootApplication的類。因此,由于 bean定義的一些方法,可能會發生一些意想不到的錯誤,或者一些不必要的組件被裝入 ApplicationContext。為了避免這種情況,我們可以在與測試類相同的包中創建帶有 @SpringBootApplication 的類。

package sample.mybatis.mapper;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
class MapperTestApplication {

}

圖片圖片

  1. 運行結果

圖片圖片

詳細內容參考 https://github.com/mybatis/spring-boot-starter/blob/master/mybatis-spring-boot-test-autoconfigure/src/site/zh/markdown/index.md**但是,**上面是使用原生mybatis的測試方式,而我們項目用的是基于mybatis封裝的開源框架tkMapper,github地址是[https://github.com/abel533/Mapper](https://github.com/abel533/Mapper),并不適用啊,無解,只能去看下mybatis-spring-boot-starter-test的原理。

實現原理

實際上mybatis-spring-boot-starter-test的實現原理很簡單,代碼目錄結構如下:

圖片圖片

  1. @MybatisTest注解如下,引入MybatisTestContextBootstrapper測試引導程序。同時引入其他的注解,進行自動裝配。

圖片圖片

  1. @AutoConfigureMybatis由MybatisTest注解引入,會去找META-INF下的spring.factories,自動組裝mybatis相關的bean

圖片圖片

那么基于目前的理解,我們也可以簡單實現一個基于TkMapper的測試框架。

Mapper測試框架

我們參照mybatis原生的實現方式

  1. 重新命名,內容不變

圖片圖片

  1. 修改spring.factories添加MapperAutoConfiguration

圖片圖片

  1. 使用自定義測試注解@MapperTest

圖片圖片

雖然這里有**insert**語句,但是測試結束,事務會被回滾,數據不會真的插入到表中,所以是可以反復進行測試的。

圖片圖片

總結

本文分享了基于springboot+mybatis項目中針對數據訪問層進行單元測試的一種方式,這種方式只注入mybatis相關的bean,快速高效的對不同類型的數據庫進行測試,保證程序的正確性。 

其實,對于大多數據的程序員來說,寫單元測試可能是一種負擔和累贅,但是如果你的單元測試真的能夠在你的項目中有其價值,那么就是值得的,千萬不要為了單元測試而單元測試。

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2023-12-11 08:25:15

Java框架Android

2021-03-28 23:03:50

Python程序員編碼

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2013-06-04 09:49:04

Spring單元測試軟件測試

2017-03-23 16:02:10

Mock技術單元測試

2017-12-12 13:17:36

機器學習代碼單元測試

2013-12-18 09:56:20

AngularJS測試

2017-01-14 23:42:49

單元測試框架軟件測試

2024-03-29 08:03:48

單元測試流量

2009-08-19 09:00:48

單元測試框架自動化測試

2011-04-18 13:20:40

單元測試軟件測試

2020-09-30 08:08:15

單元測試應用

2021-03-24 09:30:02

Jupyter not單元測試代碼

2012-11-01 11:32:23

IBMdw

2012-11-01 11:37:05

JavaScript單元測試測試工具

2023-08-02 13:59:00

GoogleTestCTest單元測試

2023-09-20 21:30:14

單元測試完全指南

2025-04-28 01:55:00

工具sqlmockSQL

2022-03-15 11:55:24

前端單元測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线超碰 | av在线视| 无码一区二区三区视频 | 久久久在线视频 | 欧美日韩亚洲系列 | 国产美女一区 | 免费观看黄色片视频 | 精品国产欧美一区二区 | 黄视频网站免费观看 | 日本不卡一区二区三区 | 国产精品毛片一区二区在线看 | 午夜精品一区二区三区在线观看 | 999免费观看视频 | 国产亚洲一区二区三区在线 | 天天夜夜操| 午夜电影网 | 久久久久久久国产精品影院 | 成人免费视频在线观看 | 美女逼网站 | 国产精品久久9 | 国产999精品久久久久久 | 中文字幕在线一区 | 91成人| 国产wwwcom| 精品香蕉一区二区三区 | 国产99久久久国产精品 | 久久精彩视频 | 国产一区二区在线观看视频 | 日韩在线免费看 | 人人种亚洲 | 国产精品无码永久免费888 | 黄色毛片在线播放 | 精品一区二区三区在线观看国产 | 日韩视频―中文字幕 | 久久精品亚洲精品国产欧美kt∨ | 日韩欧美国产精品一区 | 日韩一区二区福利 | 精品网| 最近免费日本视频在线 | 国产ts人妖系列高潮 | 国产精品中文字幕在线观看 |