Spring单元测试是否使用application.properties?Spring Boot测试数据源配置异常求助
解决Spring Boot单元测试无法读取application.properties数据源配置的问题
我之前做Spring Boot单元测试时碰到过一模一样的坑——项目跑起来完全正常,但一跑标注@RunWith(SpringJUnit4ClassRunner.class)的测试就报数据源实例化错误,折腾了好一阵才搞定。给你几个实用的排查和解决方向:
1. 先把测试类的注解配置补全
如果是Spring Boot 1.x版本,只加@RunWith(SpringJUnit4ClassRunner.class)是不够的,得搭配能加载完整应用上下文的注解;要是用的Spring Boot 2.x及以后,更推荐直接用@SpringBootTest,它已经集成了@RunWith的功能,能自动读取application.properties里的配置:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest // 加上这个,确保加载完整的Spring Boot上下文 public class YourTestClass { // 测试代码 }
2. 检查配置文件的位置和环境激活
- 确认你的
application.properties要么在src/test/resources下(测试专属配置),要么src/main/resources下的配置能被测试上下文读取到。Spring Boot测试时优先读src/test/resources的配置,没有的话才会用src/main/resources的。 - 如果用了多环境配置(比如
application-dev.properties),记得给测试类加@ActiveProfiles指定要激活的环境:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest @ActiveProfiles("dev") // 激活dev环境的配置文件 public class YourTestClass { // 测试代码 }
3. 核对数据源属性的拼写和前缀
别小看拼写错误,我之前就是把spring.datasource.url写成了spring.dataSource.url(大小写错了),导致Spring根本读不到配置。标准的数据源配置属性应该是这样的:
# 正确的属性示例 spring.datasource.url=jdbc:mysql://localhost:3306/your_db spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
4. 检查测试类的包结构
确保测试类和你的主应用类(带@SpringBootApplication的那个类)在同一个根包或者子包下。比如主类在com.example.demo,测试类最好放在com.example.demo.test或者直接com.example.demo下,这样Spring Boot才能自动扫描到配置和组件。如果测试类在别的包,就得手动指定主应用类:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = YourMainApplication.class) // 指定主应用类 public class YourTestClass { // 测试代码 }
5. 排查自定义DataSource配置类的问题
如果你自己写了@Configuration类配置数据源,要注意:
- 必须用
@ConfigurationProperties(prefix = "spring.datasource")绑定配置文件的属性,别硬编码参数:
@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public HikariDataSource dataSource() { return new HikariDataSource(); } }
- 别在配置类里写死数据源参数,不然会覆盖配置文件的值。
按照这些步骤排查下来,应该能解决Spring读取不到数据源配置的问题。
内容的提问来源于stack exchange,提问作者user4617571
相关产品推荐
相关产品推荐

