使用Testcontainers与@DataJpaTest测试Spring Data Envers遇表不存在问题
解决Spring Data Envers在@DataJpaTest下无法生成审计表的问题
核心原因
@DataJpaTest注解默认仅加载JPA核心配置,会自动排除Spring Data Envers的自动配置类,导致Envers的审计表生成逻辑未触发,同时仓库也不会被包装为支持Envers查询的实现。
解决方案
方案一:为测试类启用Envers仓库支持
在测试类上添加@EnableEnversRepositories注解,确保Envers相关配置被加载:
@DataJpaTest @Testcontainers @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @ActiveProfiles("tc") @EnableEnversRepositories // 启用Envers仓库配置 class FooRepositoryITSpec extends Specification { @Autowired private FooRepository fooRepository void "test envers functionality"() { given: var foo = new Foo() when: fooRepository.save(foo) var revisions = fooRepository.findRevisions(foo.getId()) then: revisions.size() == 1 var revision = revisions.collect().get(0) revision.getRevisionNumber() != null } }
方案二:确保实体类与JPA审计配置正确
- 实体类必须标记
@Audited注解以开启审计:
@Entity @Audited // 开启该实体的审计功能 public class Foo { // 实体字段定义 }
- 项目主配置类需添加
@EnableJpaAuditing注解,启用JPA审计基础支持。
方案三:补充测试环境的JPA配置
在application-tc.yaml中添加Envers相关的JPA配置,允许Hibernate自动生成审计表:
spring: datasource: url: jdbc:tc:postgresql:13:///test_database username: user password: password driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver jpa: hibernate: ddl-auto: update # 测试环境下允许Hibernate自动生成审计表 properties: org.hibernate.envers: audit_table_suffix: "_aud" # 确保后缀与报错中的表名匹配(默认就是_aud)
备选方案:使用完整Spring Boot上下文测试
如果上述轻量配置仍不生效,可替换@DataJpaTest为@SpringBootTest,加载完整上下文以包含所有Envers配置:
@SpringBootTest @Testcontainers @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @ActiveProfiles("tc") @Transactional class FooRepositoryITSpec extends Specification { // 测试代码保持不变 }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

