我正在使用Spring junit runner及其事务功能来在每次测试之前和之后启动和回滚事务。
但是我有一个测试类有一些繁重的数据库初始化,我希望每个测试(方法)在事务范围内运行,即在测试开始时启动一个事务,并在完成所有测试后将其回滚
答案 0 :(得分:5)
您是否意识到在一个事务中拥有所有测试方法会导致很多麻烦?基本上,您不能再依赖于拥有干净的数据库,因为其他测试方法将在此过程中对其进行修改。并且由于未指定测试方法的顺序,因此您也不能依赖它(因此您永远不会知道数据库的确切含义)。基本上您放弃了所有测试事务支持,唯一的保证是在运行整个测试用例之后,数据库将保持干净(因此其他测试用例不会受到影响)。
抱怨你的结束。我不认为Spring支持这种开箱即用的行为(部分原因是由于上面强调的原因)。但是,如果仔细查看TransactionalTestExecutionListener,它将负责Spring驱动测试中的事务支持。
@Override
public void beforeTestMethod(TestContext testContext) throws Exception {
//...
startNewTransaction(testContext, txContext);
}
和
@Override
public void afterTestMethod(TestContext testContext) throws Exception {
//...
endTransaction(testContext, txContext);
//...
}
现在看起来更近了,有未实现的beforeTestClass
和afterTestClass
...您将在Spring参考文档的第9.3.5章中找到详细的说明。提示:编写自己的监听器并使用它而不是TransactionalTestExecutionListener
。