【发布时间】:2015-09-20 11:19:08
【问题描述】:
用于对 Scala 应用程序进行单元测试的文档https://www.playframework.com/documentation/2.4.x/ScalaTestingWithScalaTest 谈到了使用 Mockito 模拟数据库访问。虽然此方法非常适用于测试从数据库从获取信息的方法,但我没有看到一个明确的解决方案如何测试插入、更新或删除数据的方法。
这是我目前设置的:
trait UserRepository { self: HasDatabaseConfig[JdbcProfile] =>
import driver.api._
class UserTable(tag: Tag) extends Table[userModel](tag, "users") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc )
def email = column[String]("email")
def * = (id.?, email) <> (userModel.tupled, userModel.unapply _)
}
def allUsers() : Future[Seq[userModel]]
def update(user: userModel) : Future[Int]
}
class SlickUserRepository extends UserRepository with HasDatabaseConfig[JdbcProfile] {
import driver.api._
protected val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
private val users = TableQuery[UserTable]
override def allUsers(): Future[Seq[userModel]] = {
db.run(users.result)
}
def update(user: userModel): Future[Int] = {
db.run(userTableQuery.filter(_.id === user.id).update(user))
}
}
class UserService(userRepository: UserRepository) {
def getUserById(id: Int): Future[Option[userModel]] = {
userRepository.allUsers().map { users =>
users.find(_.id.get == id)
}
// TODO, test this...
def updateUser(user: userModel): Future[Int] = {
userRepository.update(user)
}
}
然后是我的测试:
class UserSpec extends PlaySpec with MockitoSugar with ScalaFutures {
"UserService" should {
val userRepository = mock[UserRepository]
val user1 = userModel(Option(1), "user1@test.com")
val user2 = userModel(Option(2), "user2@test.com")
// mock the access and return our own results
when(userRepository.allUsers) thenReturn Future {Seq(user1, user2)}
val userService = new UserService(userRepository)
"should find users correctly by id" in {
val future = userService.getUserById(1)
whenReady(future) { user =>
user.get mustBe user1
}
}
"should update user correctly" in {
// TODO test this
}
}
我想我需要模拟“更新”方法并创建一个接受参数并更新模拟数据的存根。但是,我在 Scala 中的技能是有限的,我无法完全理解它。有没有更好的办法?
谢谢!
【问题讨论】:
-
由于 Slick 基于 JDBC,您可以使用Acolyte framework 定义模拟/模拟连接进行测试。
标签: scala unit-testing mockito scalatest