Spring Boot测试未使用H2数据库仍连接MySQL问题咨询
问题根因
Spring Boot不会因为引入H2依赖就自动在测试阶段切换数据源,本质是测试运行时没有加载H2对应的数据源配置,仍然读取了主代码路径下写死的MySQL连接参数,才会把测试数据写到MySQL里。常见触发场景包括:
- 没有在测试资源目录下配置独立的H2数据源,主配置文件中固定配置了MySQL的驱动、连接地址、账号信息
- 自定义了DataSource相关的Bean,没有做环境隔离,测试阶段仍然加载了MySQL连接的Bean定义
- 测试资源目录没有被构建工具识别,测试配置文件未生效,回退读取主路径的MySQL配置
解决步骤
- 配置测试环境专属数据源
在src/test/resources目录下新建配置文件(和主配置格式保持一致,用yml或者properties都可以),直接覆盖主配置的数据源参数,示例YAML配置如下:
spring: datasource: driver-class-name: org.h2.Driver # MODE=MySQL用于兼容MySQL语法,减少已有SQL的适配成本,DB_CLOSE_DELAY=-1避免内存库在连接断开后被释放 url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MySQL username: sa password: jpa: hibernate: ddl-auto: create-drop # 测试启动时建表,结束后自动删表,完全不产生持久化脏数据 database-platform: org.hibernate.dialect.H2Dialect h2: console: enabled: true # 可选,测试时开启H2控制台方便排查数据问题
如果你的主配置是用profile区分环境(比如dev/prod对应MySQL),可以把上面的配置命名为application-test.yml,在测试类上添加@ActiveProfiles("test")注解激活测试环境即可。
- 隔离自定义数据源Bean
如果你在代码里手动通过@Bean定义过MySQL数据源,给这个Bean加上条件注解,避免测试阶段加载:
@Bean @Profile("!test") // 测试环境不加载这个MySQL数据源Bean public DataSource mysqlDataSource() { // 你的MySQL数据源初始化逻辑 }
- 确认测试资源目录被识别
正常Spring Boot项目默认会把src/test/resources作为测试优先级最高的配置路径,如果你改过项目目录结构,可以在build.gradle中补全资源路径配置:
sourceSets { test { resources { srcDir file('src/test/resources') } } }
验证方式
启动测试时观察控制台打印的数据源连接信息,如果显示连接地址为jdbc:h2:mem:testdb就说明配置生效,测试执行完成后检查MySQL库,不会再出现测试过程生成的表或数据。
内容的提问来源于stack exchange,提问作者GeoT
相关产品推荐
相关产品推荐

