Как обрабатываются транзакции в интеграционном тесте устаревшего кода

Я пытаюсь понять, что происходит, когда я использую 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, не откатываются! Напечатанное сообщение журнала показывает, что транзакции инициированы и что откат выполнен успешно, но я не получаю ожидаемого поведения.


person user3139545    schedule 09.06.2015    source источник


Ответы (1)


Spring TestContext Framework (TCF) управляет тем, что я называю транзакциями, управляемыми тестами. TCF не управляет транзакциями, управляемыми приложением.

Если у вас есть код, который управляет своими собственными транзакциями (например, через Spring TransactionTemplate или какие-то другие программные средства), то эти взаимодействия с базой данных не будут откатываться TCF.

Для получения дополнительной информации обратитесь к Test-managed Transactions справочного руководства или слайд №43 из моего Тестирование с помощью Spring: введение.

Кроме того, вы, естественно, должны убедиться, что DataSource, используемый TCF, точно такой же, как DataSource, используемый Spring DataSourceTransactionManager и вашим унаследованным кодом. Если весь ваш устаревший код использует NamedParameterJdbcTemplate Spring, этот код должен участвовать в правильной транзакции. В противном случае вам нужно будет использовать DataSourceUtils.getConnection(DataSource) Spring, чтобы убедиться, что устаревший код работает с транзакциями, управляемыми Spring, и транзакциями, управляемыми тестами.

person Sam Brannen    schedule 02.07.2015