2011-03-15 96 views
0

我使用的是Spring junit runner,它的事务功能可以在每次测试之前和之后启动和回滚事务。春季,交易和单元测试 - 如何在课堂级别设置交易

但是,我有一个测试类,有一些沉重的数据库初始化,我希望每个测试(方法)在事务范围内运行,即在测试开始时启动一个事务并在类中的所有测试之后回滚完成。

回答

4

您是否意识到在单个事务中使用类中的所有测试方法会造成很大的麻烦?基本上,你不能再依靠一个干净的数据库,因为其他测试方法会一路修改它。而且由于测试方法的顺序没有指定,所以你也不能依赖它(所以你永远不会知道数据库究竟保存了什么)。本质上,你放弃了所有的测试事务支持,唯一的保证就是在运行整个测试用例之后,数据库将保持干净(所以其他测试用例不会受到影响)。

抱怨你的结尾。我不认为Spring支持这种开箱即用的行为(部分原因在于上面强调的原因)。但是,如果您仔细查看TransactionalTestExecutionListener,它将负责Spring-powered测试中的事务性支持。

@Override 
public void beforeTestMethod(TestContext testContext) throws Exception { 
    //... 
    startNewTransaction(testContext, txContext); 
} 

和:

@Override 
public void afterTestMethod(TestContext testContext) throws Exception { 
    //... 
    endTransaction(testContext, txContext); 
    //... 
} 

现在看起来更近,也有未实现beforeTestClassafterTestClass ...你会发现详细说明了如何把这个一切在春季参考文档9.3.5章。提示:写下你自己的听众,并用它代替TransactionalTestExecutionListener