首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Play Framework2.5测试ApplicationLifecycle指南Specs2设置

Play Framework2.5测试ApplicationLifecycle指南Specs2设置
EN

Stack Overflow用户
提问于 2016-11-21 21:19:26
回答 1查看 1.1K关注 0票数 2

我正在尝试用play2-reactivemongo运行一些功能测试。我会尽量具体,但如果有什么遗漏,请让我知道。

我的依赖项在这里

代码语言:javascript
复制
libraryDependencies ++= Seq(
  cache,
  "org.reactivemongo" %% "play2-reactivemongo" %  "0.12.0",
  "com.mohiva" %% "play-silhouette" % "4.0.0",
  "com.mohiva" %% "play-silhouette-testkit" % "4.0.0" % "test",
  specs2 % Test
)

MongoUserDao.scala

代码语言:javascript
复制
import play.modules.reactivemongo._
import play.modules.reactivemongo.json._
import reactivemongo.play.json.collection.JSONCollection

class MongoUserDao @Inject() (val reactiveMongoApi: ReactiveMongoApi) extends UserDao {
  val usersFuture = reactiveMongoApi.database.map(_.collection[JSONCollection]("users"))
...
}

DaoSpecResources.scala

代码语言:javascript
复制
trait DaoSpecResources {

  val timeout = DurationInt(10).seconds

  val fakeApp = new GuiceApplicationBuilder()
    .in(Mode.Test)
    .configure(
      "play.modules.enabled" -> List("play.modules.reactivemongo.ReactiveMongoModule"),
      "mongodb.uri" -> "mongodb://localhost:27017/test"
    )
    .build

  val reactiveMongoApi = fakeApp.injector.instanceOf[ReactiveMongoApi]
  ...
}

当我尝试运行测试时,我得到了这个错误

代码语言:javascript
复制
[error] cannot create an instance for class daos.UserDaoSpec
[error]   caused by com.google.inject.CreationException: Unable to create injector, see the following errors:
[error]
[error] 1) No implementation for play.api.inject.ApplicationLifecycle was bound.
[error]   while locating play.api.inject.ApplicationLifecycle
[error]     for parameter 1 at services.ApplicationTimer.<init>(ApplicationTimer.scala:24)
[error]   at Module.configure(Module.scala:23) (via modules: com.google.inject.util.Modules$OverrideModule -> Module)
[error]
[error] 1 error
EN

回答 1

Stack Overflow用户

发布于 2016-11-21 23:05:52

这是由app/services/ApplicationTimer.scala引起的,它依赖于ApplicationLifecycle,但是您还没有将任何实现绑定到ApplicationLifecycleApplicationTimer是每个新的Play项目中都包含的一个演示。如果不需要它,您可能应该将其完全删除,否则,如果在测试模式下运行,则至少将其禁用。参见disabling modulesoverriding modules

解决方案

但是,由于DefaultReactiveMongoApi也依赖于ApplicationLifecycle,因此您需要提供到ApplicationLifecycle实现的绑定。最简单的方法:

代码语言:javascript
复制
import play.api.inject.{ ApplicationLifecycle, DefaultApplicationLifecycle }
import play.api.inject.bind

trait DaoSpecResources {

  val timeout = DurationInt(10).seconds

  val fakeApp = new GuiceApplicationBuilder()
    .in(Mode.Test)
    .configure(
      "play.modules.enabled" -> List("play.modules.reactivemongo.ReactiveMongoModule"),
      "mongodb.uri" -> "mongodb://localhost:27017/test"
    )
    .bindings(bind[ApplicationLifecycle].to[DefaultApplicationLifecycle])
    .build

  val reactiveMongoApi = fakeApp.injector.instanceOf[ReactiveMongoApi]

  val lifecycle = fakeApp.injector.instanceOf[DefaultApplicationLifecycle]
  def stopApp = lifecycle.stop()

}

(新增5行: imports、bindingslifecyclestopApp)

然后,在测试规范的末尾添加step(stopApp),如下所示:

代码语言:javascript
复制
class FooSpec extends PlaySpecification with DaoSpecResources {

    // Your examples...

    step(stopApp)

}

替代解决方案

就我个人而言,我会创建一个专门的特征来扩展SpecificationPlaySpecification,它会自动设置和拆卸所有东西,比如in this example from specs2 documentation

代码语言:javascript
复制
trait PlayWithMongoSpecification extends PlaySpecification {

  val timeout = DurationInt(10).seconds

  val fakeApp = new GuiceApplicationBuilder()
    .in(Mode.Test)
    .configure(
      "play.modules.enabled" -> List("play.modules.reactivemongo.ReactiveMongoModule"),
      "mongodb.uri" -> "mongodb://localhost:27017/test"
    )
    .bindings(bind[ApplicationLifecycle].to[DefaultApplicationLifecycle])
    .build

  val reactiveMongoApi = fakeApp.injector.instanceOf[ReactiveMongoApi]

  val lifecycle = fakeApp.injector.instanceOf[DefaultApplicationLifecycle]
  def stopApp = lifecycle.stop()

  override def map(fs: =>Fragments) = fs ^ step(stopApp)

}

class FooSpec extends PlayWithMongoSpecification {

    // Your examples...

}

您可以考虑将reactiveMongoApi设置为lazy val

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40721172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档