PAYATHON 2026

如何在 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。
  • 容器启动后,远程数据库仍可能无法访问。测试环境需要提供有效的远程连接属性和网络访问权限。

备注:内容仅供参考。