我有一些使用AbstractTransactionalJUnit4SpringContextTests的集成测试。我希望能够看到在事务期间对数据库所做的更改,既可以通过查看数据库(例如当设置断点时),也可以从另一个应用程序查看。
我使用Postgres, DataSourceTransactionManager和直接JDBC。我尝试将测试的隔离级别设置为未提交读取:
@Transactional(isolation=Isolation.READ_UNCOMMITTED)
public class MyTestFixture
{
...
}
但是没有任何区别。有什么建议吗?
为了调试目的和对数据库状态的经验检查,您需要确保客户端配置了READ_UNCOMMITTED
的隔离级别(如果测试代码(或测试应用程序代码)没有提交其事务)。将测试代码的隔离级别设置为READ_UNCOMMITTED
只会影响测试代码可以看到的;它不会影响其他数据库客户端可以看到的内容。
然而,更健壮的方法是使用JDBC在测试中查询数据库的状态,然后断言预期的状态。JdbcTestUtils
提供了静态方法,使这些测试场景更容易,AbstractTransactionalJUnit4SpringContextTests
包括几个protected
方法作为方便——例如,countRowsInTable
, countRowsInTableWhere
等。您可以在Spring框架参考手册的 testing 一章中的PetClinic示例中看到这种测试的实际示例。除此之外,推荐使用Spring的JdbcTemplate
在事务集成测试中直接查询底层数据库的状态。
问候,
Sam (Spring TestContext Framework的作者)