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 测试期间未获取属性的主要内容,如果未能解决你的问题,请参考以下文章