如何更改功能测试的Guice绑定?

时间:2015-09-14 18:07:52

标签: scala testing playframework guice

我正在使用Guice作为DI提供商的Play(v.4.4)应用程序。一切运行正常,但我有一组运行ScalaTestPlus的功能测试,我想在测试运行时替换一些依赖项。这些测试是通过在检查我的REST API时扩展OneServerPerSuite类来编写的。

在测试期间有没有办法让其他依赖项?

编辑:示例代码:

样本控制器:

class UserController @Inject()(userService: UserService) extends AbstractController { ... }

模块中的dependecy定义:

bind(classOf[UserService]) to (classOf[ProdUserService])

我的测试是这样的:

class ApiTest extends PlaySpec with OneServerPerSuite {

    "User API should" must {
         "get User's data" in {
             (...) //calling to an endpoint and verifying response
         }
     }
}

我希望将ProdUserService替换为其他实现,但仅限于测试。

1 个答案:

答案 0 :(得分:1)

这应该这样做:

import play.api.test._
import play.api.test.Helpers._
import play.api.inject.bind
import play.api.Application
import play.api.inject.guice.GuiceApplicationBuilder
import database.AccountDAO
import play.api.Configuration
import play.api.Mode

class ApiTest extends PlaySpec with OneServerPerSuite {

 def app = new GuiceApplicationBuilder() // you create your app
        .configure(
          Configuration.from(
            Map( // a custom configuration for your tests only
              "slick.dbs.default.driver" -> "slick.driver.H2Driver$",
              "slick.dbs.default.db.driver" -> "org.h2.Driver",
              "slick.dbs.default.db.connectionPool" -> "disabled",
              "slick.dbs.default.db.keepAliveConnection" -> "true",
              "slick.dbs.default.db.url" -> "jdbc:h2:mem:test",
              "slick.dbs.default.db.user" -> "sa",
              "slick.dbs.default.db.password" -> "")))
        .bindings(bind[UserService].to[UserServiceImpl]) // here you can define your bindings for an actual implementation (note the use of square brackets)
        .in(Mode.Test)
        .build()


    "User API should" must {
         "get User's data" in new WithApplication(app) {
            // if you want to get the controller with everything injected
            val app2controller = Application.instanceCache[controllers.UserController]
            val userController = app2controller(app) // with this you get the controller with the service injected

             (...) //calling to an endpoint and verifying response
         }
     }
}