我是 spring 新手,在运行一些测试时遇到了一些问题。我有一些带有以下代码的测试类,这些代码应该回滚我的(在内存中的 h2 中)数据库:
@Autowired
PlatformTransactionManager txm;
TransactionStatus txstatus;
@BeforeEach
public void setupDB() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
txstatus = txm.getTransaction(def);
assumeTrue(txstatus.isNewTransaction());
txstatus.setRollbackOnly();
}
@AfterEach
public void rollback() {
txm.rollback(txstatus);
}
我的问题是,如果一个测试类完成,我会得到一个 JdbcSQLIntegrityConstraintViolationException (唯一索引或主键冲突:..),因为我的数据库没有相应地回滚,并且再次执行插入语句,因为数据库没有得到已清除。有人知道如何解决这个问题吗?有没有办法回滚插入或在完成插入后不进行插入?
最佳答案
您可以使用
注释您的测试类@Transactional
Spring 将处理所有事情(这意味着每个测试都将在其自己的事务中运行,之后将回滚)。
您还可以使用
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
但这很繁重,因为必须重新创建整个 Spring 上下文。
关于java - Spring测试数据库回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60913470/