如何在 Spring Boot 集成测试中同时使用 Testcontainers 和 JdbcTemplate?
可以。需要在同一个测试 Spring 上下文中加载两个 repository 及各自的数据源配置。@DataJpaTest 和 @JdbcTest 都是测试切片,只加载各自关注的组件。你现在通过排除 CentralUserRepository 来运行本地 JPA 测试,是因为这个切片上下文没有加载远程 repository 所需的配置。
使用完整应用上下文
这类集成测试可以使用 @SpringBootTest,并导入 Testcontainers 配置。这样 Spring 就能同时创建本地 JPA repository、远程 JdbcTemplate repository,以及它们所需的数据源配置:
@SpringBootTest
@Import(TestContainerConfiguration.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class RepositoryIntegrationTest {
@Autowired
LocalUserRepository localUserRepository;
@Autowired
CentralUserRepository centralUserRepository;
// 编写同时调用两个 repository 的测试
}
请将 LocalUserRepository 替换为应用中的实际 JPA repository。还要确认组件扫描或显式导入会加载 CentralDataSourceConfiguration 和远程 repository。如果这些类不在启动类的组件扫描范围内,可以通过 @Import 加载相应配置。
@AutoConfigureTestDatabase(replace = NONE) 可以避免测试自动配置替换已有数据源。Testcontainers 负责本地数据库,远程数据源则继续使用测试环境提供的 spring.datasource.central.* 配置。请确认测试环境中的远程数据库是只读连接,并且网络可达。
确认两个 repository 使用各自的数据源
将两个数据源注册为 Spring bean 后,还需要确认它们分别连接到正确的数据源。JPA 的 EntityManagerFactory 和事务管理器应指向本地数据源;远程 repository 则应使用带有 @Qualifier("centralDataSource") 的 JdbcTemplate。如果应用配置了多个事务管理器,测试或 repository 的事务配置也应明确指定对应的管理器,避免事务绑定到错误的数据源。
问题描述中没有提供本地 JPA 配置和实体管理器工厂,因此无法给出适用于该项目的完整 bean 配置。可以检查本地 JPA 配置是否显式关联本地 DataSource,并确认远程查询通过 centralDataSourceJdbcTemplate 执行。
检查容器连接配置
现有的 @ServiceConnection 配置可以继续用于本地 PostgreSQL。如果项目通过自定义 bean 创建本地 DataSource,请确认该 bean 使用了容器提供的连接信息。如果连接信息没有自动接入,可以在测试配置中将容器的 JDBC URL、用户名和密码写入本地数据源对应的属性,或显式传给本地数据源配置。具体属性名取决于应用现有的数据源配置方式。
注意事项
- 确保
CentralDataSourceConfiguration不会覆盖本地 JPA 使用的主数据源。多数据源 bean 应保留明确的名称,并使用@Qualifier。 @JdbcTest和@DataJpaTest适合各自的切片测试。若要同时验证本地 JPA 和远程 JDBC 访问,请确认完整上下文加载了两边所需的 bean。- 容器启动后,远程数据库仍可能无法访问。测试环境需要提供有效的远程连接属性和网络访问权限。
备注:内容仅供参考。
