H2 嵌入式数据库在 Spring Boot 测试期间未获取属性

Posted

技术标签:

【中文标题】H2 嵌入式数据库在 Spring Boot 测试期间未获取属性【英文标题】:H2 Embedded database not picking up properties during test on spring boot 【发布时间】:2017-10-23 09:02:03 【问题描述】:

我正在尝试创建一个使用嵌入式 H2 数据库的测试。但是我必须更改 spring.datasource.url,我不能使用 spring boot 创建的默认值。 (这是因为我得把H2数据库的模式改成mysql

这是我的test class

@JdbcTest
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
public class DemoApplicationTests 

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() 
        System.out.println(dataSource);
   

这是我的application-test.properties

 spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL
 spring.datasource.username=dbuser
 spring.datasource.password=dbpass

我的依赖:

compile('org.springframework.boot:spring-boot-starter-batch')
runtime('com.h2database:h2')
compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '1.5.3.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.5.3.RELEASE'

控制台输出:

启动嵌入式数据库:url='jdbc:h2:mem:bfad6b71-3e2d-4a47-a32d-c76988b3c5f6;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'

我希望 url 是这样的:jdbc:h2:mem:testdb,我还希望它采用 MODE=MYSQL 设置。

我尝试关注this post,但没有成功。

【问题讨论】:

【参考方案1】:

Spring Boot 的 @DataJdbcTest@DataJpaTest@JdbcTest,一直到 @AutoConfigureTestDatabase 最终都会调用 TestDatabaseAutoConfiguration,默认情况下,它将配置一个内存中的嵌入式数据库实例,并自动生成唯一的名称。

这可能会给您带来问题,例如您碰巧使用了带有@Table 和非空白catalog 属性的JPA 实体,因为H2 要求目录名称与其数据库名称相同。

正如 Dane Savot 在他的回答中所说的那样

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

将解决该测试类的问题,但如果您想全局解决它,请添加

spring.test.database.replace=none

发送至您的 src/test/resources/application.properties.yaml。该属性控制@AutoConfigureTestDatabase.replace 的行为。

【讨论】:

【参考方案2】:

您需要告诉 Spring 不要将随机嵌入的数据库名称替换为以下内容:

@AutoConfigureTestDatabase(替换= AutoConfigureTestDatabase.Replace.NONE)

然后它应该获取您在 application.properties 中声明的属性。

请随意推荐它是否适合你。

【讨论】:

【参考方案3】:

这对我有用

@RunWith(SpringRunner.class)
@TestPropertySource(locations = "classpath:application-mysql.properties")
@SpringBootTest
public abstract class ExternalDbApplicationTestBase 


我使用这个类作为所有相关数据库集成类的基础。

【讨论】:

也许你的配置文件不在类路径中? 我不认为这是问题所在,但我该如何排除呢?我对这一切还不是很熟悉

以上是关于H2 嵌入式数据库在 Spring Boot 测试期间未获取属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中单元测试数据库的切换策略

Spring-Boot / H2 将数据库快照写入文件系统

在 Spring Boot 中使用嵌入式数据库进行测试

Flyway 与 Spring Boot 的集成不会在嵌入式 H2 数据库上执行迁移脚本

在内存数据库中使用 Spring Boot 测试

spring Boot 整合H2+Mybatis环境搭建