使用@DataJpaTest注解时无法加载application.properties文件的问题
解决@DataJpaTest无法加载application.properties的问题
我来帮你捋捋这个问题——我之前也碰到过类似的坑!首先得搞清楚@DataJpaTest的本质:它是Spring Boot提供的切片测试注解,专门用来聚焦测试JPA相关组件(比如Repository、Entity),默认情况下会自动配置一个嵌入式内存数据库,并且只会加载和JPA相关的Bean,不会启动完整的Spring Boot应用上下文。这就是为什么你加了@TestPropertySource却没生效的核心原因。
为什么@SpringBootTest能正常加载?
@SpringBootTest会加载完整的应用上下文,它会自动扫描并加载src/main/resources下的application.properties,所以你的配置能正常生效,但代价是测试启动速度会慢很多,毕竟加载了整个应用的Bean。
解决方案:让@DataJpaTest正确读取你的配置
要让@DataJpaTest加载application.properties里的数据库配置,你需要做两件事:
- 禁用它默认的嵌入式数据库配置,这样才会使用你配置的真实数据库
- 确保配置文件能被上下文正确读取
修改后的测试类代码如下:
@RunWith(SpringRunner.class) @DataJpaTest @TestPropertySource(locations = "classpath:application.properties") // 禁用默认的嵌入式数据库,使用配置文件里的数据库 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) public class EntityRepositoryTests { // 注入你的Repository进行测试 @Autowired private YourEntityRepository repository; // 测试方法示例 @Test public void testRepositoryOperation() { // ... 你的测试逻辑 } }
额外注意点
- 如果你的
application.properties里包含非JPA相关的配置(比如Redis、MQ的配置),@DataJpaTest依然不会加载这些配置对应的Bean,因为它只关注JPA切片。如果需要这些配置,要么改用@SpringBootTest,要么通过@Import手动导入需要的配置类。 - 如果你使用的是Spring Boot 2.2+,
@RunWith(SpringRunner.class)可以省略,直接用@DataJpaTest即可,它会自动使用Spring的测试运行器。
内容的提问来源于stack exchange,提问作者user09
相关产品推荐
相关产品推荐

