我有一些通常看起来如下的测试类
@RunWith(SpringJUnit4ClassRunner.class)
@org.springframework.transaction.annotation.Transactional
public class SpringTestRunnerTransactionTest {
// Some tests which involve inserting data in the db here --> No persisted entries but
// entries can be fetched in same transaction
}
传递我所有当前的测试(还包括查询已插入同一测试用例中的插入数据)。但是,当我之后检查数据库时,没有持久的条目。
在测试方法之上添加@org.springframework.transaction.annotation.Transactional
注释时也是如此,即
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringTestRunnerTransactionTest {
@org.springframework.transaction.annotation.Transactional
@Test
public void test() {
// Some tests which involve inserting data in the db here --> No persisted entries but
// entries can be fetched in same transaction
}
}
然而,有趣的是,将注释添加到某个虚拟方法中,最后条目将保留在db中。即以下“作品”:
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringTestRunnerTransactionTest {
@Test
public void test() {
abstraction();
}
@org.springframework.transaction.annotation.Transactional
public void abstraction(){
// Doing all the tests here works fine and the entities
// are persisted in the database!!!!!
}
}
现在我想知道为什么会这样。我假设在第一种情况下,事务未提交或回滚,但我不明白为什么。或者是否存在直接注释测试类和方法的一般问题?
更多信息:我正在使用SpringData JPA / Hibernate / H2堆栈。
谢谢
答案 0 :(得分:1)
默认情况下,事务在spring测试中回滚。如果你想提交使用
在课程级别@TransactionConfiguration(defaultRollback = false)
或在方法级别@Rollback(false)
。