Spring Boot 如果希望AutoConfigureTestDatabase为每个测试创建新连接,请自定义H2参数

lzfw57am  于 2023-02-04  发布在  Spring
关注(0)|答案(1)|浏览(106)

Spring Boot(2.1.3)项目中,我尝试对内存H2数据库(2.1.210)运行集成测试,还在Spring的data.sql中插入了一些数据。
我用@AutoConfigureTestDatabase注解了测试,所有测试都按预期工作。现在我想改变兼容模式,但我找不到这样做的选项。

如果希望AutoConfigureTestDatabase为每个测试创建一个新数据库,如何自定义H2数据库?

到目前为止,我试过:

spring.test.database.replace=none
spring.datasource.url=jdbc:h2:mem;DB_CLOSE_DELAY=1;

但是我遇到了“表已经存在”或“唯一约束违规”,因为系统似乎没有删除数据库,而是在现有数据库的基础上重新执行脚本。https://stackoverflow.com/a/47897350/3429660
我也尝试过不使用AutoConfigureTestDatabase,但我遇到了同样的问题。

p8h8hvxi

p8h8hvxi1#

我也遇到过同样的问题,但是找到了解决方案。如果你查看org.springframework.boot.jdbc.EmbeddedDatabaseConnection#H2枚举值,你会发现数据源url看起来有点不同

jdbc:h2:mem:%s;DB_CLOSE_DELAY=1;

示例化测试时,会执行某些逻辑,将'%s'占位符替换为某个UUID值。因此,每个测试都在单独的数据库上执行。要在您的一侧实现相同的逻辑,您可以创建执行相同逻辑的新Bean。

@Bean
public DataSource dataSource(
    @Value("${spring.datasource.driver-class-name}") String driverClassName,
    @Value("${spring.datasource.url}") String url,
    @Value("${spring.datasource.username}") String username,
    @Value("${spring.datasource.password}") String password) {
  DriverManagerDataSource dataSource = new DriverManagerDataSource();
  dataSource.setDriverClassName(driverClassName);
  dataSource.setUrl(String.format(url, UUID.randomUUID()));
  dataSource.setUsername(username);
  dataSource.setPassword(password);

  return dataSource;
}

遗憾的是,您必须在测试属性文件中定义所有上述属性。

相关问题