【发布时间】:2014-10-31 15:16:28
【问题描述】:
用于创建datasource 我有
object MyDataSource {
priavte lazy val dataSource: javax.sql.DataSource = {
val ds = new BasicDataSource
val conf = ConfigFactory.load()
val url = conf.getString("jdbc-url")
val driver = conf.getString("jdbc-driver")
val username = conf.getString("db-username")
val password = conf.getString("db-password")
val port = conf.getString("db-port")
val maxActive = conf.getInt("max-active")
val maxIdle = conf.getInt("max-idle")
val initSize = conf.getInt("init-size")
ds.setDriverClassName(driver)
ds.setUsername(username)
ds.setPassword(password)
ds.setMaxActive(maxActive)
ds.setMaxIdle(maxIdle)
ds.setInitialSize(initSize)
ds.setUrl(url)
ds
}
lazy val database = Database.forDataSource(dataSource)
}
MyDataSource 使用如下
def insertCompany = {
MyDataSource.database.withSession{ implicit session =>
company.insert(companyRow)
}
}
现在进行测试,我有 trait DatabaseSpec 加载测试数据库(指向测试数据库)配置并具有以下夹具
def withSession(testCode: Session => Any) {
val session = postgres.createSession()
session.conn.setAutoCommit(false)
try {
testCode(session)
} finally {
session.rollback()
session.close()
}
}
然后测试代码可以混入DatabaseSpec并使用withSession来测试事务代码。
现在的问题是,在 insertCompany 中将 MyDataSource.database.withSession 从 DataSource 抽象出来以便可以使用 DatabaseSpec 测试方法并指向测试数据库的最佳做法是什么?
【问题讨论】:
-
Acolyte 框架可用于测试任何基于 JDBC 的持久性代码,通过隔离连接模型:acolyte.eu.org。这是 Slick 的示例:github.com/voxolab/speech-recognition-api/blob/master/test/… .