Spring Boot JUnit5单元测试不连接外部数据库的配置方案
你当前测试类仅排除DataSourceAutoConfiguration无法解决启动报错问题:只要项目引入了Spring Data JPA等持久层starter,JPA相关自动配置仍会尝试读取数据源参数,测试环境无对应环境变量时依然会触发初始化失败。以下是两种可落地的实现方案:
方案1:测试环境使用H2内存数据库作为模拟数据源
该方案无需修改生产代码,运行逻辑最接近生产环境,适合需要验证持久层逻辑的测试场景:
- 第一步:引入H2数据库测试依赖,依赖范围设置为test,不会被打包到生产环境
Maven依赖配置:
Gradle依赖配置:<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency>testImplementation 'com.h2database:h2' - 第二步:在测试资源目录
src/test/resources下新建测试专属配置文件application-test.properties,配置H2内存库参数,覆盖生产环境的环境变量读取规则:# H2内存库连接配置 spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MySQL spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver # JPA配置 spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect spring.jpa.properties.hibernate.format_sql=true若生产环境使用PostgreSQL等其他数据库,将H2连接串的
MODE参数调整为对应数据库类型即可,可降低SQL语法兼容问题。 - 第三步:修改测试类,激活测试配置文件,移除之前手动排除数据源自动配置的注解,让Spring Boot自动识别classpath下的H2依赖完成内存数据源装配:
package com.legacybanking.legacyBankingAPI; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) @SpringBootTest @ActiveProfiles("test") class LegacyBankingApiApplicationTests { @Test void contextLoads() { } }
方案2:通过Mock完全屏蔽数据库依赖
该方案启动速度快,不需要真实的数据库连接,适合仅校验非持久层逻辑、不需要验证SQL执行正确性的测试场景:
- 第一步:修改测试类的自动配置排除规则,把所有持久层相关的自动配置全部排除,不要仅排除
DataSourceAutoConfiguration:package com.legacybanking.legacyBankingAPI; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) @SpringBootTest @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, JpaRepositoriesAutoConfiguration.class }) class LegacyBankingApiApplicationTests { @Test void contextLoads() { } } - 第二步:如果测试的业务类中注入了DAO/Repository层的Bean,直接使用
@MockBean注解Mock对应持久层Bean,在测试方法中手动设置返回值即可,不需要真实执行数据库操作:// 示例:Mock用户Repository层Bean @MockBean private UserRepository userRepository; @Test void testUserService() { // 手动设置Mock方法的返回值 when(userRepository.findById(1L)).thenReturn(new User(1L, "testUser")); // 编写后续业务测试逻辑 }
内容的提问来源于stack exchange,提问作者kofi boateng
相关产品推荐
相关产品推荐

