ps0*_*604 9 scala scalatest playframework slick play-slick
我有以下使用PlaySlick连接到数据库的DAO.该类有一个read
我需要使用ScalaTest测试的方法.我的问题是我不知道如何模拟DatabaseConfigProvider
在UsersDAO
类中注入它并测试read
方法.这是要测试的类:
class UsersDAO @Inject()(@NamedDatabase("mydb")
protected val dbConfigProvider: DatabaseConfigProvider)
extends with HasDatabaseConfigProvider[JdbcProfile] {
import driver.api._
val db1 = dbConfigProvider.get[JdbcProfile].db
def read (sk: Int) = {
val users = TableQuery[UserDB]
val action = users.filter(_.sk === sk).result
val future = db1.run(action.asTry)
future.map{
case Success(s) =>
if (s.length>0)
Some(s(0))
else
None
case Failure(e) => throw new Exception ("Failure: " + e.getMessage)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试编写测试:
class UserDAOTest extends PlaySpec with OneAppPerSuite {
implicit override lazy val app = new GuiceApplicationBuilder().
configure(
Configuration.from(
Map(
"slick.dbs.mydb.driver" -> "slick.driver.MySQLDriver$",
"slick.dbs.mydb.db.driver" -> "com.mysql.jdbc.Driver",
"slick.dbs.mydb.db.url" -> "jdbc:mysql://localhost:3306/control",
"slick.dbs.mydb.db.user" -> "root",
"slick.dbs.mydb.db.password" -> "xxxxx"
)
)
).build
val dbConfigProvider = app.injector.instanceOf[DatabaseConfigProvider]
"Example " should {
"be valid" in {
val controller = new UsersDAO(dbConfigProvider)
val result = controller.read(1)
println(result)
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行测试时它失败并显示以下错误消息:
com.google.inject.ConfigurationException:Guice配置错误:
1)没有绑定play.api.db.slick.DatabaseConfigProvider的实现.找到play.api.db.slick.DatabaseConfigProvider
恕我直言,最好不要干扰 Play 的注入内容,而只是使用它。这应该有效:
class UserDAOTest extends PlaySpec with OneAppPerSuite with ScalaFutures {
implicit override lazy val app = new GuiceApplicationBuilder().
configure(
"slick.dbs.mydb.driver" -> "slick.driver.MySQLDriver$",
"slick.dbs.mydb.db.driver" -> "com.mysql.jdbc.Driver",
"slick.dbs.mydb.db.url" -> "jdbc:mysql://localhost:3306/control",
"slick.dbs.mydb.db.user" -> "root",
"slick.dbs.mydb.db.password" -> "xxxxx").build
def userDAO(implicit app: Application): UserDAO = Application.instanceCache[UserDAO].apply(app)
"UserDAO" should {
"do whatever" in {
whenReady(userDAO.read(1)) { res =>
println(res)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经更新了我的回购,以防我错过了什么。