如果使用注射,则不会拾取PlaySpec测试类

时间:2018-01-25 13:04:44

标签: scala dependency-injection playframework scalatest

在我的Play 2.6.x应用程序中,我正在使用PlaySpec进行测试。现在我想注入一些在测试代码中使用的对象。

class AuthControllerTest @Inject()(userRepository: UserRepository)
  extends PlaySpec with GuiceOneAppPerSuite with Injecting {

  "Foo bar" should {
    "do xyz" in {
      // do something with userRepository
    }
  }
}

但是,这个类永远不会被用于测试,例如运行时sbt test

一个简单的解决方法是从当前的Play实例手动获取注入器,但不推荐使用Play.current并且它通常感觉很糟糕:

class AuthControllerTest
  extends PlaySpec with GuiceOneAppPerSuite with Injecting {

  "Foo bar" should {
    "do xyz" in {
      val userRepository = Play.current.injector.instanceOf[UserRepository]
      // do something with userRepository
    }
  }
}

为什么前一个例子不起作用?是否有比后一个例子更清洁的方法?

1 个答案:

答案 0 :(得分:2)

Play Framework不会像第一个示例那样为测试执行依赖项注入。在第二个问题上,您不需要Play.current,因为GuiceOneAppPerSuite可以向您提供应用程序(app)。所以你可以这样做:

val userRepository = app.injector.instanceOf[UserRepository].

通过使用Injecting,您可以进一步简化它:

val userRepository = inject[UserRepository]

来自official docs

  

如果测试类中的所有或大多数测试都需要一个Application,并且它们都可以共享相同的Application实例,那么将特质GuiceOneAppPerSuite与GuiceFakeApplicationFactory特征混合使用。 您可以从应用领域访问应用

此处还有一个关于Injecting的重点:

https://www.playframework.com/documentation/2.6.x/Highlights26#Injecting