Spring集成测试时如何切换BalanceDb依赖的JdbcTemplate为内存库版本
问题原因
你的BalanceDb类中通过@Autowired按类型注入JdbcTemplate时,Spring容器默认匹配到了生产配置中名称为jdbcTemplate的生产库Bean,即使测试环境加载了testJdbcTemplate,也没有替换掉BalanceDb中已经注入的生产环境JdbcTemplate,所以调用insert方法依然走生产库。
可行解决方案
方案1:测试配置覆盖默认JdbcTemplate(无需修改生产代码)
在TestDataSourceConfig中新增一个带@Primary注解的、名称和生产JdbcTemplate一致的Bean,Spring会优先注入带@Primary的同类型Bean:
@Configuration public class TestDataSourceConfig { // 原有testDataSource、testJdbcTemplate配置保留 @Bean(name = "jdbcTemplate") @Primary public JdbcTemplate primaryJdbcTemplate(@Qualifier("testDataSource") DataSource ds) { return new JdbcTemplate(ds); } }
同时确保测试类加载测试配置:
@ExtendWith(SpringExtension.class) @SpringBootTest(classes = {TestDataSourceConfig.class, BalanceDb.class}) public class BalanceDbTest { // 原有测试代码不变 }
方案2:测试中直接替换BalanceDb的JdbcTemplate字段(最便捷)
用Spring自带的ReflectionTestUtils工具直接修改BalanceDb的私有jdbcTemplate属性,不需要修改任何生产或配置代码:
@ExtendWith(SpringExtension.class) @SpringBootTest public class BalanceDbTest { @Autowired @Qualifier("testJdbcTemplate") private JdbcTemplate testJdbcTemplate; @Autowired private BalanceDb balanceDb; @BeforeEach void injectTestJdbcTemplate() { ReflectionTestUtils.setField(balanceDb, "jdbcTemplate", testJdbcTemplate); } // 原有testInsert代码不变 }
方案3:通过Profile区分环境(适合多环境统一管理)
给生产和测试的配置类加上@Profile注解,测试类激活测试环境Profile:
- 生产配置类加
@Profile("prod") - 测试配置类加
@Profile("test"),同时在测试配置里定义名称为jdbcTemplate的Bean - 测试类加
@ActiveProfiles("test")注解
这样Spring会根据激活的Profile加载对应配置的jdbcTemplate,自动注入到BalanceDb中。
内容的提问来源于stack exchange,提问作者Prithvi Sharma
相关产品推荐
相关产品推荐

