如何在@JdbcTest中配置H2的SQL Server兼容模式?
问题描述
我需要执行以下SQL查询:
SELECT [ID] FROM TEST_TABLE WHERE ID = ? OFFSET 0 ROWS FETCH NEXT ? ROWS ONLY
该查询仅在激活H2的SQL Server兼容模式时才能运行,对应的JDBC URL为:
jdbc:h2:~/test;MODE=MSSQLServer;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
但我无法为如下形式的测试配置该模式:
@JdbcTest @Sql(scripts = "/test_setup.sql") class RepositoryTest {
我尝试过两种配置方式:
- 使用
@AutoConfigureTestDatabase注解 - 在
test/java/resources/下的application.properties中添加配置:
spring.datasource.url= jdbc:h2:~/test;MODE=MSSQLServer;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE spring.test.database.datasource.url= jdbc:h2:~/test;MODE=MSSQLServer;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE
这些配置都无效,最终抛出异常:
org.springframework.jdbc.BadSqlGrammarException
解决方法
1. 给测试类直接加配置注解
在RepositoryTest上添加@TestPropertySource,直接指定数据源URL,优先级最高,能覆盖默认配置:
@JdbcTest @Sql(scripts = "/test_setup.sql") @TestPropertySource(properties = { "spring.datasource.url=jdbc:h2:mem:test;MODE=MSSQLServer;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE" }) class RepositoryTest { // 你的测试代码 }
这里用内存数据库mem:test是为了避免本地文件数据库的残留数据问题,测试更干净。
2. 用测试环境专属配置文件
在test/resources下新建application-test.properties,Spring Boot会自动识别测试环境并加载这个文件:
spring.datasource.url=jdbc:h2:mem:test;MODE=MSSQLServer;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
之后测试类不用改任何注解,直接运行即可。
3. 手动写测试数据源配置类
如果前两种方法都没效果,就自己写个配置类来定义数据源:
@Configuration public class TestDataSourceConfig { @Bean public DataSource dataSource() { return DataSourceBuilder.create() .url("jdbc:h2:mem:test;MODE=MSSQLServer;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE") .driverClassName("org.h2.Driver") .username("sa") .password("") .build(); } }
然后在测试类里导入这个配置:
@JdbcTest @Sql(scripts = "/test_setup.sql") @Import(TestDataSourceConfig.class) class RepositoryTest { // 你的测试代码 }
注意事项
@JdbcTest默认会自动配置嵌入式数据库,普通的application.properties配置可能被忽略,所以得用高优先级的方式指定- 测试尽量用内存H2数据库,不要用本地文件的,避免之前的测试数据干扰
- 确保你的H2版本支持SQL Server兼容模式,建议用最新稳定版
内容的提问来源于stack exchange,提问作者ng.newbie
相关产品推荐
相关产品推荐

