@DataJpaTest 未更新带有 @Version 注释的 属性
@DataJpaTest not updating property annotated with @Version
我在一项测试中遇到问题,该测试检查具有 属性 版本(用 @Version
注释)的实体在更新后是否增加。
- 如果我使用注释
@SpringBootTest
版本会增加。
- 如果我使用
@DataJpaTest
,版本不会递增。
你知道如何配置 @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 语句在您认为它们被执行时被执行。
我在一项测试中遇到问题,该测试检查具有 属性 版本(用 @Version
注释)的实体在更新后是否增加。
- 如果我使用注释
@SpringBootTest
版本会增加。 - 如果我使用
@DataJpaTest
,版本不会递增。
你知道如何配置 @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 语句在您认为它们被执行时被执行。