SpringbootMybatis-Plus数据库单元测试实战(三种⽅式)
  单元测试长久以来是热门话题,本⽂不会讨论需不需要写单测,可以看看参考资料1,我个⼈认为写好单测应该是每个优秀开发者必备的技能,关于写单测的好处在这⾥我就不展开讨论了,快速进⼊本⽂着重讨论的话题,如何写好数据库单测。
  为什么要写数据库单测? 相信⼤家是不是有这样类似的经历,在写完复杂的sql语句后,⾃信满满的提测,发现很⼤⼀部分Bug都是因为sql语句出现问题了,要么少写逗号,要么漏了字段,悔不当初哇,为啥写完不多测测呢!
  没关系!这就教你如何写数据库单测,让你轻松告别数据库相关bug。
1. 数据库样例和环境
  我们以⽤户表为例开启本次教程:
图1.1 ⽤户表ER图
  引⼊mybatis-plus插件后,mapper类如下:
@Mapper
public interface UserMapper extends BaseMapper<UserDO> {
}
  整体环境:
spring boot: 1.5.18.RELEASE
mybatis: 3.5.1
mybatis plus:3.4.0(此时最新版本,我们会⽤到最新版本的特性)
  在这⾥我们直接测试的是mybatis plus提供的⼀些CRUD,当然这些CRUD⼀般都不会错,实际项⽬中我们只需对⾃定义的SQL进⾏单元测试即可。
2. ⽅式⼀:启动整个环境
  这种⽅式应该是⽇常环境使⽤最多的,利⽤SpringBoot⾃1.4.0版本开始引⼊的@SpringBootTest注解可以启动我们单元测试所需要的所有环境,当然,如果你项⽬中运⽤了其他分布式服务,他同样也会启动这些服务。单测代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testCurd() {
UserDO userDO = new UserDO();
userDO.setId(7777L);
userDO.setGmtModified(new Date());
userDO.setGmtCreate(new Date());
userDO.setRealName("ke");
userDO.setUserName("ni");
userMapper.insert(userDO);
UserDO select = userMapper.selectById(1);
System.out.println(select);
}
}
@SpringBootTest注解可以设置需要启动加载的类,按需加载
3. ⽅式⼆:只启动数据库环境+远程数据库
  在参考资料2中,最新的mybatis-plus发布版本(3.4.0)中引⼊了test starter,如图:
图3.1 Mybatis-plus3.4.0引⼊test模块
  模块引⼊了新的注解@MybatisPlusTest,这个注解可以帮助我们只启动特定特定的模块,直接上单测代码:
@RunWith(SpringRunner.class)
@MybatisPlusTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testCurd() {
UserDO userDO = new UserDO();
userDO.setId(7777L);
userDO.setGmtModified(new Date());
userDO.setGmtCreate(new Date());
userDO.setRealName("ke");
userDO.setUserName("ni");
userMapper.insert(userDO);
UserDO select = userMapper.selectById(1);
System.out.println(select);
}
}
  是不是很轻松?不过我们要注意如下⼏点关键点:
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)的作⽤是使⽤⾃定义的数据源,⽽⾮使⽤⾃动配置的嵌⼊式内存数据源
如果你在项⽬正在使⽤类似于druid的连接池,在test模块的时候需要在application配置⽂件⾥⾯直接使⽤jdbc数据源即可,因为@MybatisPlusTest注解不会启动连接池框架,典型的配置⽂件l如下:
spring:
datasource:
url: jdbc:mysql://1.110:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
4. ⽅式三:只启动数据库环境+本地数据库
  在⽅式⼆的基础上,进⾏如下步骤:
我们去掉@AutoConfigureTestDatabas注解,直接启动测试嵌⼊式数据库即可,在这⾥我们选⽤H2内存数据库,⾸先在pom中引⼊H2 database maven依赖;
然后后在test环境下引⼊sechema.sql⽂件,这个⽂件是⽤来初始化数据库的,核⼼是创建表格语句;
最后去掉这个页⾯以后写法和⽅式⼆⼀样,在这⾥就不给出
注意: sechema.sql⽂件要符合嵌⼊式数据库的语法,在本例中为h2数据库,如果你正在使⽤mysql数据库,则需要把mysql的数据库语法转换为h2的数据库语法。
5. @MybatisPlusTest注解原理
  如果你之前使⽤过MyBatis-Spring-Boot-Starter-Test中的@MybatisTest(参考资料3)的话,你会发现@MybatisPlusTest注解原理与之类似,都是限制spring boot的⾃动配置(参考资料4),只需要加载特定的配置即可。我们来看⼀下注解源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(MybatisPlusTestContextBootstrapper.class)
@ExtendWith({SpringExtension.class})
@OverrideAutoConfiguration(
enabled = false
)
@TypeExcludeFilters({MybatisPlusTypeExcludeFilter.class})
@Transactional
@AutoConfigureCache
@AutoConfigureMybatisPlus
@AutoConfigureTestDatabase
@ImportAutoConfiguration
public @interface MybatisPlusTest {
String[] properties() default {};
boolean useDefaultFilters() default true;
Filter[] includeFilters() default {};
Filter[] excludeFilters() default {};
@AliasFor(
annotation = ImportAutoConfiguration.class,
attribute = "exclude"
)
Class<?>[] excludeAutoConfiguration() default {};
}
@OverrideAutoConfiguration(enabled = false)是关键,它关闭了⾃动配置,⽽⼀般在spring boot项⽬中enable是开启的;
@AutoConfigureMybatisPlus注解是⾃定义注解,这个注解定义了加载所有所需的加载类,在spring.factories⾥⾯声明了要⾃动配置的类:
# AutoConfigureMybatis auto-configuration imports
st.autoconfigure.AutoConfigureMybatisPlus=\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.ansaction.TransactionAutoConfiguration,\
batisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
batisplus.autoconfigure.MybatisPlusAutoConfiguration
@AutoConfigureTestDatabase注解表明使⽤的是内存数据库⽽不是真实数据库
  有了这些限制和规定以后,mybatis-plus在测试环境内就可以⾃动加载所需要的的配置了,这样就去除了⾮必要资源的加载。
6. 总结
图6.1 三种数据库单测总结
  如果你正在使⽤mysql数据库,我推荐使⽤⽅式⼆。如果你能解决mysq语法转h2的问题,推荐使⽤⽅式三,这样在离线的情况也可以进⾏单测,不需要连接远程数据库。jdbctemplate和mybatis
PS:如果你有好的⼯具来完成mysql转换h2的话可以在评论区⾥⾯推荐⼀下,我这边了好久,包括⾃定义写转换、⼀些专业⼯具等,感觉对navicat导出的语句作转换不是很好好⽤。
7.参考资料
到此这篇关于Springboot Mybatis-Plus数据库单元测试实战(三种⽅式)的⽂章就介绍到这了,更多相关Springboot Mybatis-Plus单元测试内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。