【发布时间】:2011-07-16 00:07:05
【问题描述】:
我正在使用 Spring junit runner,它的事务功能可以在每次测试之前和之后启动和回滚事务。
但是我有一个带有大量数据库初始化的测试类,我希望每个测试(方法)都在事务范围内运行,即在测试开始时启动事务并在类中的所有测试完成后回滚.
【问题讨论】:
标签: unit-testing spring transactions junit
我正在使用 Spring junit runner,它的事务功能可以在每次测试之前和之后启动和回滚事务。
但是我有一个带有大量数据库初始化的测试类,我希望每个测试(方法)都在事务范围内运行,即在测试开始时启动事务并在类中的所有测试完成后回滚.
【问题讨论】:
标签: unit-testing spring transactions junit
您是否知道在一个事务中包含类中的所有测试方法会带来很多麻烦?基本上,您不能再依赖于拥有干净的数据库,因为其他测试方法会在此过程中对其进行修改。而且因为没有指定测试方法的顺序,所以你也不能依赖它(所以你永远不会知道数据库到底保存了什么)。本质上你放弃了所有测试事务支持,你唯一的保证是运行整个测试用例后,数据库将保持干净(因此其他测试用例不会受到影响)。
你的抱怨结束了。我认为 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。
【讨论】: