温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在Springboot中利用Mybatis-Plus实现一个单元测试功能

发布时间:2020-12-23 14:26:23 来源:亿速云 阅读:545 作者:Leah 栏目:开发技术

这篇文章给大家介绍如何在Springboot中利用Mybatis-Plus实现一个单元测试功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

  单元测试长久以来是热门话题,本文不会讨论需不需要写单测,可以看看参考资料1,我个人认为写好单测应该是每个优秀开发者必备的技能,关于写单测的好处在这里我就不展开讨论了,快速进入本文着重讨论的话题,如何写好数据库单测。

  为什么要写数据库单测? 相信大家是不是有这样类似的经历,在写完复杂的sql语句后,自信满满的提测,发现很大一部分Bug都是因为sql语句出现问题了,要么少写逗号,要么漏了字段,悔不当初哇,为啥写完不多测测呢!

  没关系!这就教你如何写数据库单测,让你轻松告别数据库相关bug。

1. 数据库样例和环境

  我们以用户表为例开启本次教程:

如何在Springboot中利用Mybatis-Plus实现一个单元测试功能

图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,如图:

如何在Springboot中利用Mybatis-Plus实现一个单元测试功能

图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注解不会启动连接池框架,典型的配置文件application.yml如下:

spring:
 datasource:
  url: jdbc:mysql://xxx.xxx.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文件要符合嵌入式数据库的语法,在本例中为h3数据库,如果你正在使用mysql数据库,则需要把mysql的数据库语法转换为h3的数据库语法。

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
com.baomidou.mybatisplus.test.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.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

@AutoConfigureTestDatabase注解表明使用的是内存数据库而不是真实数据库

  有了这些限制和规定以后,mybatis-plus在测试环境内就可以自动加载所需要的的配置了,这样就去除了非必要资源的加载。

6. 总结

如何在Springboot中利用Mybatis-Plus实现一个单元测试功能

图6.1 三种数据库单测总结

  如果你正在使用mysql数据库,我推荐使用方式二。如果你能解决mysq语法转h3的问题,推荐使用方式三,这样在离线的情况也可以进行单测,不需要连接远程数据库。

PS:如果你有好的工具来完成mysql转换h3的话可以在评论区里面推荐一下,我这边找了好久,包括自定义写转换、一些专业工具等,感觉对navicat导出的语句作转换不是很好好用。

关于如何在Springboot中利用Mybatis-Plus实现一个单元测试功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI