@DataJpaTest 未更新带有 @Version 注释的 属性

@DataJpaTest not updating property annotated with @Version

我在一项测试中遇到问题,该测试检查具有 属性 版本(用 @Version 注释)的实体在更新后是否增加。

你知道如何配置 @DataJpaTest 使递增工作吗?

请在下面找到工作测试:

@SpringBootTest
public class TestAuditing extends TestCrud<AuditingEntity> {

    ...

    @Test
    @Override
    void update() {
        Long version = entity.getVersion();
        super.update();
        assertEquals(++version, entity.getVersion());
    }
}

这是无效测试:

@ExtendWith(SpringExtension.class)
@DataJpaTest
public class TestAuditing extends TestCrud<AuditingEntity> {
    
    ...

    @Test
    @Override
    void update() {
        Long version = entity.getVersion();
        super.update();
        assertEquals(++version, entity.getVersion());
    }
}

这里是TestCrud摘要的代码class

public abstract class TestCrud<E extends AbstractEntity> {

    protected static AbstractEntity entity;

    ...

    @Test
    void update() {
        E updatedEntity = crudAdapter.update((E) entity);
        assertEquals(updatedEntity.getId(), entity.getId());
        entity = updatedEntity;
    }
    ...

提前感谢您的回答!

我无法给出明确的答案,因为您没有发布实际应该执行任何操作的代码。但问题的可能原因是 DataJpaTest 包含 @Transactioanl 注释,从而将事务边界从存储库方法的入口和出口移动,我假设您在某处使用测试方法。由于 JPA 在事务结束之前不会刷新更改,因此您不会获得版本增量。

对于像您这样取决于交易的确切范围的测试,我建议使用 TransactionTemplate,以便您可以完全控制您的交易。您还可以使用 SQL 日志记录来确保 SQL 语句在您认为它们被执行时被执行。