SpringBoot中如何对数据访问层进行单元测试?
创始人
2025-06-27 17:21:12
0

前言

我们公司作为一个面向银行、金融机构的TO B类企业,频繁遇到各个甲方爸爸提出的国产化数据库的改造需求,包括OceanBase, TiDB,geldenDB等等。每次适配都需要投入大量的人力进行测试工作,那么有没有更高效、低成本的方式去解决这个问题呢?本文就介绍一种快高效、可复用的解决方案——对数据访问层做单元测试。

Mybatis测试依赖

我们项目采用的SpringBoot + Mybatis作为开发框架,大家第一想到可以用SpringBoot自带的测试注解@SpringBootTest进行测试。但是使用该注解有一个最大的弊端就是需要启动整个容器,注入全部的bean,那么一次测试就相当于启动一次应用,我们的应用启动一次就要花费近70~80秒,黄花菜都凉了。

图片图片

那么有没有更好的办法,有必要注入全量的bean吗?是不是只要注入数据访问层相关的bean即可,其实官方的mybatis就给了我们这样的的解决方案。

  1. 引入依赖mybatis-spring-boot-starter-test

  org.mybatis.spring.boot
  mybatis-spring-boot-starter-test
  2.3.0
  test
  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,快速高效的对不同类型的数据库进行测试,保证程序的正确性。 

其实,对于大多数据的程序员来说,写单元测试可能是一种负担和累赘,但是如果你的单元测试真的能够在你的项目中有其价值,那么就是值得的,千万不要为了单元测试而单元测试。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...