SpringBoot对数据访问层进行单元测试的方法详解
Mybatis测试依赖
我们项目采用的 SpringBoot
+ Mybatis
作为开发框架,大家第一想到可以用 SpringBoot
自带的测试注解 @SpringBootTest
进行测试。但是使用该注解有一个最大的弊端就是需要启动整个容器,注入全部的bean,那么一次测试就相当于启动一次应用,我们的应用启动一次就要花费近70~80秒,黄花菜都凉了。
那么有没有更好的办法,有必要注入全量的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 { }
运行结果
但是, 上面是使用原生mybatis的测试方式,而我们项目用的是基于mybatis封装的开源框架 tkMapper
, github
地址是 https://github.com/abel533/Mapper
,并不适用啊,无解,只能去看下 mybatis-spring-boot-starter-test
的原理。
实现原理
实际上 mybatis-spring-boot-starter-test
的实现原理很简单,代码目录结构如下:
@MybatisTest
注解如下,引入 MybatisTestContextBootstrapper
测试引导程序。同时引入其他的注解,进行自动装配。
@AutoConfigureMybatis
由 MybatisTest
注解引入,会去找 META-INF
下的 spring.factories
,自动组装mybatis相关的bean
那么基于目前的理解,我们也可以简单实现一个基于 TkMapper
的测试框架。
Mapper测试框架
我们参照 mybatis
原生的实现方式
重新命名,内容不变
修改 spring.factories
添加 MapperAutoConfiguration
使用自定义测试注解 @MapperTest
虽然这里有 insert
语句,但是测试结束,数据不会真的插入到表中,因为 MapperTest
注解上包含了事务注解,所以是可以反复进行测试的。
总结
本文分享了基于 springboot+mybatis
项目中针对数据访问层进行单元测试的一种方式,这种方式只注入mybatis相关的bean,快速高效的对不同类型的数据库进行测试,保证程序的正确性。
其实,对于大多数据的程序员来说,写单元测试可能是一种负担和累赘,但是如果你的单元测试真的能够在你的项目中有其价值,那么就是值得的,千万不要为了单元测试而单元测试。
以上就是SpringBoot对数据访问层进行单元测试的详细内容,更多关于SpringBoot对数据访问层测试的资料请关注脚本之家其它相关文章!
相关文章
解决SpringBoot中的Scheduled单线程执行问题
在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败,这篇文章主要介绍了SpringBoot中的Scheduled单线程执行问题及解决方法,需要的朋友可以参考下2022-06-06SpringBoot之使用Redis实现分布式锁(秒杀系统)
这篇文章主要介绍了SpringBoot之使用Redis实现分布式锁(秒杀系统),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-04-04idea一键部署SpringBoot项目jar包到服务器的实现
我们在开发环境部署项目一般通过idea将项目打包成jar包,然后连接linux服务器,将jar手动上传到服务中,本文就来详细的介绍一下步骤,感兴趣的可以了解一下2023-12-12解决mybatis where-if中if不能识别大写AND,OR的问题
这篇文章主要介绍了解决mybatis where-if中if不能识别大写AND,OR的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2021-02-02Idea springboot springCloud热加载热调试两种常用方式
这篇文章主要介绍了Idea springboot springCloud热加载热调试常用的两种方式,在项目开发的过程中,需要修改调试的时候偶每次都需要重启项目浪费时间,下面是我整理的两种常用的两种方式,需要的朋友可以参考下2023-04-04
最新评论