【发布时间】:2019-01-28 01:28:26
【问题描述】:
我正在尝试充实我的应用程序的抽象 DAO 测试工具,以支持回滚对数据库的任何测试修改。我知道 slick 支持(db.run(<some DBIOAction>.transactionally) 的事务,但这不能作为抽象测试类的一部分,因为 db 操作需要在实际测试方法中实际运行。
目前,我正在尝试使用BeforeAndAfter 的runTest 方法包装测试方法,并尝试找到一些允许我将测试执行包装在事务中的巧妙方法。感觉像是正确的第一步,但我正在努力弄清楚如何在不干扰常规测试创建的同时仍然能够回滚事务(即我不想手动添加 DBIOAction.failure 在每个改变数据库状态的数据库测试)。
我尝试在方法周围设置autocommit=false,例如
db.run(
SimpleJdbcOperation(_.connection.setAutoCommit(false)) andThen
DBIOAction.successful(super.runTest) zip
SimpleJdbcOperation(_.connection.rollBack()))
但我认为连接池正在挫败该特定方法,因为在测试方法中获取自动提交状态返回 true,并且回滚不执行任何操作。
除了 hacky(手动 DBIOAction.failure())或浪费(每次测试后删除并重新创建表/模式)解决方案之外,我还能做些什么吗?
【问题讨论】:
-
您还可以查看Acolyte 了解真正独立的基于 JDBC 的单元测试
标签: postgresql scala playframework transactions slick