You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:53:38