如何在遗留代码的集成测试中处理事务

How are transactions handled in integrationtest of legacy code

我试图了解当我在我的集​​成测试中尝试回滚遗留代码所做的更改时使用 AbstractTransactionalJUnit4SpringContextTests 时发生了什么。

遗留代码使用 NamedParameterJdbcTemplate 与数据库通信。事务管理器是 DataSourceTransactionManager 类型,我的数据源是 DriverManagerDataSource.

类型

这是我测试的整体结构class。

@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 所做的更改不会回滚!打印的日志消息表明事务已启动并且回滚成功但我没有得到预期的行为。

Spring TestContext Framework (TCF) 管理我所说的测试管理事务。 TCF 管理应用程序管理的事务

如果您有代码管理自己的事务(例如,通过 Spring 的 TransactionTemplate 或其他一些编程方式),那么与数据库的那些交互将不会回滚由 TCF 提供。

有关详细信息,请参阅 Test-managed Transactions section of the reference manual or slide #43 from my Testing with Spring: An Introduction 演示文稿。

此外,您自然必须确保 TCF 使用的 DataSource 与 Spring DataSourceTransactionManager 和您的遗留代码使用的 DataSource 完全相同。如果您所有的遗留代码都使用 Spring 的 NamedParameterJdbcTemplate,该代码应该参与正确的交易。否则,您将需要使用 Spring 的 DataSourceUtils.getConnection(DataSource) 来确保遗留代码适用于 Spring 管理和测试管理的事务。