SrpiingBoot Test单元测试使用随机数据库

前言

在编写的单元测试中,有时候我们希望直接连接到数据库来验证dao层的功能。但是由于环境问题,我们又不能直接在开发的测试数据库中去执行这些测试用例,因为可能会对其他的数据造成一些影响。此外,如果我们是在ci中跑这些单元测试,那么在使用库的过程中为了避免对其他并行ci造成影响,就要保证数据库的相对独立性。
为了解决这些问题,我们可以在执行单测的时候新建一个数据库,并在单测结束时将这个数据库删除,并且数据库名使用随机生成的字符串。
下面来介绍如何在SrpingBoot Test的基础上实现上述的要求。
首先来大体确定一下我们的流程,具体的细节在实现的时候再去考虑:

  1. 在执行单测之前创建数据库
  2. 生成一个4位随机字符串并作为数据库名
  3. 连接数据库
  4. 执行单测
  5. 执行完毕后删除数据库

创建和删除数据库

如果我们要创建数据库,那么一定是要在初始化Spring上下文即连接数据库之前,否则按照配置文件去连接一个还未创建的数据库一定会报错。这样就用到了@BeforAll这个关键注解。被这个注解的方法会在执行单测前执行,要求方法必须被static关键字修饰。

@BeforeAll
public static void initDb() {
     MySQLHelper.createDatabase("127.0.0.1", 3306, "admin", randomDbName);
}

上面那个工具类方法就是使用jdbc connection去创建一个数据库,按照自己的配置去创建即可,这里不再给出实现。最后一个参数是我们的数据库名,后文会给出说明,暂时不需要关注。
这个方法就保证了我们在执行单测前就会创建出一个名为randomDbName的数据库。
删除数据库的方式想必你已经猜到了,就是使用对应的@AfterAll注解。这个注解和上面的@BeforAll注解正好提供了相反的功能,在结束单测前执行被该注解修饰的方法。

@AfterAll
public static void unInitDb() {
    MySQLHelper.dropDatabase("127.0.0.1", 3306,"admin", randomDbName);
}

由于比较简单,工具类的实现同样不给出了。

使用随机字符作为库名

接下来就要考虑如何使用随机字符作为库名了,也就是如何使用到上前提到的randomDbName字段。我们的一个选择是使用hutool下的RandomUtil作为工具,来生产一个4位的随机字符串。生成的字符串放到一个成员保存,然后在初始化方法中进行使用:

private static String randomDbName;

@BeforeAll
public static void initDb() {
	 randomDbName = "r_" + RandomUtil.randomString(4);
     MySQLHelper.createDatabase("127.0.0.1", 3306, "admin", randomDbName);
}

这样就解决了随机库名的生成问题。但是这样子还是不够的,因为我们生成了库名,也能够创建和销毁了,但是如何才能让Spring容器加载到呢?或者说要怎么样才能让我们的properties配置文件能够给配进去呢?

写入到properties配置文件中

这里我们还要介绍一个注解,@DynamicPropertySource。这个注解可以帮助我们不使用原始配置文件中的配置,而是使用该注解声明的动态配置。注解要修饰一个静态方法,入参需要包含一个DynamicPropertyRegistry。这里我们假设数据库名的配置是datasource.default-database。然后使用该方法将原来配置文件中的配置动态修改掉。

@DynamicPropertySource
public static void dbNameProperty(DynamicPropertyRegistry registry) {
    registry.add("datasource.default-database", randomDbName::toString);
}

其中randomDbName就是上文中的静态成员变量。在我们初始化randomDbName后,再使用@DynamicPropertySource注解动态赋给配置文件中的配置。这样Spring容器在初始化时就能加载到我们的随机数据库名了。
到此为止就已经全部结束了,快启动你的单元测试看看效果吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值