我们公司作为一个面向银行、测试金融机构的中何TO B类企业,频繁遇到各个甲方爸爸提出的对数单元国产化数据库的改造需求,包括OceanBase,据访进行 TiDB,geldenDB等等。问层每次适配都需要投入大量的测试人力进行测试工作,那么有没有更高效、中何低成本的对数单元方式去解决这个问题呢?本文就介绍一种快高效、可复用的据访进行解决方案——对数据访问层做单元测试。
我们项目采用的问层SpringBoot + Mybatis作为开发框架,大家第一想到可以用SpringBoot自带的测试测试注解@SpringBootTest进行测试。但是使用该注解有一个最大的弊端就是需要启动整个容器,注入全部的bean,那么一次测试就相当于启动一次应用,我们的应用启动一次就要花费近70~80秒,黄花菜都凉了。
图片
那么有没有更好的办法,有必要注入全量的bean吗?是不是只要注入数据访问层相关的bean即可,其实官方的mybatis就给了我们这样的的解决方案。
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter-test</artifactId> <version>2.3.0</version> <scope>test</scope></dependency>
@Mapperpublic interface CityMapper { @Select("SELECT * FROM CITY WHERE state = #{ state}") City findByState(@Param("state") String state);}
// 使用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;@SpringBootApplicationclass MapperTestApplication { }
图片
图片
详细内容参考 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的实现原理很简单,代码目录结构如下:
图片
图片
图片
那么基于目前的理解,我们也可以简单实现一个基于TkMapper的测试框架。
我们参照mybatis原生的实现方式
图片
图片
图片
虽然这里有**insert**语句,但是测试结束,事务会被回滚,数据不会真的插入到表中,所以是可以反复进行测试的。
图片
本文分享了基于springboot+mybatis项目中针对数据访问层进行单元测试的一种方式,这种方式只注入mybatis相关的bean,快速高效的对不同类型的数据库进行测试,保证程序的正确性。
其实,对于大多数据的程序员来说,写单元测试可能是一种负担和累赘,但是如果你的单元测试真的能够在你的项目中有其价值,那么就是值得的,千万不要为了单元测试而单元测试。
责任编辑:武晓燕 来源: JAVA旭阳 数据访问层项目(责任编辑:知识)
前10个月安徽省重点项目完成投资15725亿 开工3235个
2017年山东潍坊市财政整合资金49.4亿元为农业农村发展提供新动能
两融余额1.42万亿元创5年新高 短期内市场可能形成震荡上行格局
江西省发展改革委召开江西省重点骨干企业第二季度经济形势分析座谈会