本文介绍如何在SpringBoot项目中,使用Junit5 + DataBaseRider实现跨多个数据库的操作。
应用场景
在涉及微服务的测试中,当测试某个微服务时,通常都会发生服务间调用。也就是测试微服务A时,A可能会向微服务B请求某些数据来完成某些业务处理。如下图所示,
而很有可能,这些数据是源自B服务的数据库。
在测试时,为了保证自动化用例可以反复被执行,就需要控制被测系统的上下文。也就是说,为了能够让针对A服务的测试能够通过,我们需要保证B系统的正常运转,尤其是要对B系统的数据库进行控制,如确保B数据库的某个表中的数据是某些固定的记录,也就是在用例执行之前测试框架通过setup步骤临时导入到该表中。 如何用DataBaseRider实现上述操作呢?
一般来讲,在SpringBoot项目的配置文件,如application.properties中已经默认有一个数据库的配置了,一般是spring.datasource下的配置项。 为了能够控制第二个数据库,需要在默认数据库的基础上,额外增加一个需要连接的B服务的数据库的配置。因为这些配置只在集成测试或者系统测试中需要,可以考虑额外采用一个application-test.properties文件来存放这些信息,而不是污染项目组原有的配置文件。 一个可能的样例如下:
spring.datasource.url=jdbc:mysql://45.93.1.5:3306/fire?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.bbb.driver-class-name=oracle.jdbc.OracleDriver`
spring.datasource.bbb.url=jdbc:oracle:thin:@localhost:1521:bbb
spring.datasource.bbb.username=bbb
spring.datasource.bbb.password=bbb
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean(name = "bbb")
@ConfigurationProperties(prefix = "spring.datasource.bbb")
public DataSource dataSourceSentence() {
return DataSourceBuilder.create().build();
}
}
**案例代码源自网络
将DBRider自带的案例稍微修改下
package com.github.database.rider.springboot;
@DBRider //default datasource is used
@SpringBootTest
public class MultipleDataSourcesTest {
@Autowired
UserService userService;
@Test
@DataSet("users.yml")
public void shouldListUsers() {
//http call here
assertThat(userService.findByEmail("dbrider@mail.com")).isEqualTo(new User(3));
}
@Test
@DBRider(dataSourceBeanName = "companyDataSource")
@DataSet(value = "companies.yml",cleanBefore = true)
@ExpectedDataSet("expectedCompany.yml")
public void shouldDeleteCompany() {
userService.deleteComany(1L);
}
}
通过@DBRider(dataSourceBeanName = "companyDataSource") 来指定所使用的dataSource,并通过它来实现对数据库的操作。
由于@DBRider注解既可以在类上,也可以用在方法上,使用中注意使用范围。如果未申明所使用的dataSource的话,将默认使用带有@Primary注解的dataSourceBean。
这样就可以实现对多个数据库的操作了。