在尝试回滚遗留代码所做的更改时,我试图了解在我的集成测试中使用AbstractTransactionalJUnit4SpringContextTests
时发生了什么。
遗留代码使用NamedParameterJdbcTemplate
与数据库通信。事务管理器的类型为DataSourceTransactionManager
,我的数据源类型为DriverManagerDataSource
。
这是我的测试类的整体结构。
@Begin
//Make initial setup of database using `JDBCTemplate` from `AbstractTransactionalJUnit4SpringContextTests`.
@Test
//Call legacy code that makes inserts to database.
我的问题是,如果我的分歧是错误的,那么通过扩展AbstractTransactionalJUnit4SpringContextTests
我会使我的所有测试都是事务性的。这具有预期的效果,即我的测试函数和遗留代码直接进行的所有更改都从测试函数事务中调用并在测试结束时隐式回滚
我做的一些观察是:
@Begin
函数与测试函数一起使用时可以正常工作,该函数不会调用进行更改的遗留代码。在这种情况下,@Begin
中所做的更改将被回滚。
但是,如果我使用@Begin
@Test
函数调用遗留代码进行更改@Begin
和@Test
所做的更改都不会被回滚!打印的日志消息指出事务已启动并且回滚成功但我没有得到预期的行为。
答案 0 :(得分:1)
Spring TestContext Framework (TCF)管理我称之为测试管理的事务。 TCF 不管理应用程序管理的交易。
如果您有代码管理自己的事务(例如,通过Spring TransactionTemplate
或其他一些编程手段),则TCF不会回滚与数据库的那些交互。
有关详细信息,请参阅我的Test-managed Transactions演示文稿中参考手册或幻灯片#43的Testing with Spring: An Introduction部分。
此外,您自然必须确保TCF使用的DataSource
与Spring DataSource
和您的遗留代码使用的DataSourceTransactionManager
完全相同。如果您的所有遗留代码都使用了Spring NamedParameterJdbcTemplate
,那么该代码应该参与正确的事务。否则,您需要使用Spring的DataSourceUtils.getConnection(DataSource)
来确保遗留代码适用于Spring管理和测试管理的事务。