SpringBoot对数据访问层进行单元测试的方法详解

 更新时间:2023年08月14日 10:54:12   作者:Young丶  
我们公司作为一个面向银行、金融机构的TO B类企业,频繁遇到各个甲方爸爸提出的国产化数据库的改造需求,包括OceanBase, TiDB,geldenDB等等,本文就介绍一种快高效、可复用的解决方案——对数据访问层做单元测试,需要的朋友可以参考下

Mybatis测试依赖

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

img

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

引入依赖 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>

Mapper接口

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

使用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");
    }
}

自定义一个启动类

@MybatisTest 在默认情况下将会探测到带有 @SpringBootApplication 的类。 因此,由于 bean 定义的一些方法,可能会发生一些意想不到的错误,或者一些不必要的组件被装入 ApplicationContext 。 为了避免这种情况,我们可以在与测试类相同的包中创建带有 @SpringBootApplication 的类。

package sample.mybatis.mapper;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
class MapperTestApplication {
}

img

运行结果

img

但是, 上面是使用原生mybatis的测试方式,而我们项目用的是基于mybatis封装的开源框架 tkMapper github 地址是 https://github.com/abel533/Mapper ,并不适用啊,无解,只能去看下 mybatis-spring-boot-starter-test 的原理。

实现原理

实际上 mybatis-spring-boot-starter-test 的实现原理很简单,代码目录结构如下:

img

@MybatisTest 注解如下,引入 MybatisTestContextBootstrapper 测试引导程序。同时引入其他的注解,进行自动装配。

img

@AutoConfigureMybatis MybatisTest 注解引入,会去找 META-INF 下的 spring.factories ,自动组装mybatis相关的bean

img

那么基于目前的理解,我们也可以简单实现一个基于 TkMapper 的测试框架。

Mapper测试框架

我们参照 mybatis 原生的实现方式

重新命名,内容不变

img

修改 spring.factories 添加 MapperAutoConfiguration

img

使用自定义测试注解 @MapperTest

img

虽然这里有 insert 语句,但是测试结束,数据不会真的插入到表中,因为 MapperTest 注解上包含了事务注解,所以是可以反复进行测试的。

img

总结

本文分享了基于 springboot+mybatis 项目中针对数据访问层进行单元测试的一种方式,这种方式只注入mybatis相关的bean,快速高效的对不同类型的数据库进行测试,保证程序的正确性。

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

以上就是SpringBoot对数据访问层进行单元测试的详细内容,更多关于SpringBoot对数据访问层测试的资料请关注脚本之家其它相关文章!

相关文章

  • 什么是Java布隆过滤器?如何使用你知道吗

    什么是Java布隆过滤器?如何使用你知道吗

    这篇文章主要为大家详细介绍了Java布隆过滤器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 利用Stream聚合函数如何对BigDecimal求和

    利用Stream聚合函数如何对BigDecimal求和

    这篇文章主要介绍了利用Stream聚合函数如何对BigDecimal求和问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 浅谈java中为什么实体类需要实现序列化

    浅谈java中为什么实体类需要实现序列化

    下面小编就为大家带来一篇浅谈java中为什么实体类需要实现序列化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • java 获取中文拼音首字母及全拼的实践

    java 获取中文拼音首字母及全拼的实践

    本文主要介绍了java 获取中文拼音首字母及全拼的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • java中的Arrays这个工具类你真的会用吗(一文秒懂)

    java中的Arrays这个工具类你真的会用吗(一文秒懂)

    这篇文章主要介绍了java中的Arrays这个工具类你真的会用吗,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Mac Maven环境搭建安装和配置超详细步骤

    Mac Maven环境搭建安装和配置超详细步骤

    这篇文章主要给大家介绍了关于Mac Maven环境搭建安装和配置的超详细步骤,Maven是一种常用的Java构建工具,它可以自动化构建、测试和打包Java项目,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 如何在 Java 中实现一个 redis 缓存服务

    如何在 Java 中实现一个 redis 缓存服务

    为什么要使用缓存?说到底是为了提高系统的运行速度。将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度。下面我们来一起深入学习一下吧
    2019-06-06
  • Mybatis-Plus条件构造器的具体使用方法

    Mybatis-Plus条件构造器的具体使用方法

    这篇文章主要介绍了Mybatis-Plus条件构造器的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Windows安装Maven并配置环境的详细步骤

    Windows安装Maven并配置环境的详细步骤

    Maven是一个非常流行的构建和项目管理工具,用于Java开发,它提供了一个强大的依赖管理系统和一系列标准化的构建生命周期,本文将指导您如何在Windows操作系统上安装和配置Maven,需要的朋友可以参考下
    2023-05-05
  • Spring框架事务属性中事务隔离级别与传播行为全面讲解

    Spring框架事务属性中事务隔离级别与传播行为全面讲解

    这篇文章主要介绍了Spring框架声明式事务的事务隔离级别和事务传播行为,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11

最新评论