由于我使用了依赖性注射,Scala play 2.5测试没有运行

时间:2016-12-05 19:51:51

标签: scala playframework sbt guice scalatest

我移动了我的单元测试:

class UserSpec extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions
{

致:

class UserSpec @Inject() (implicit exec: ExecutionContext, db: DBConnectionPool)
  extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions
{

第一个版本的一切都很好,但现在,当我启动测试时,我得到以下结果:

[info] No tests were executed.
[success] Total time: 4 s, completed Dec 5, 2016 8:35:24 PM

请注意,我并不希望我的测试在测试和生产中注入相同的依赖关系。谢谢!

修改

Code available on github

2 个答案:

答案 0 :(得分:3)

在使用scalatest编写Play测试时,您不会使用构造函数注入。 相反,当您在服务器或应用特征(例如app.injector)中混合时,您可以直接在OneAppPerTest字段内访问注入器。这样,如果您需要DI图中的任何内容,您可以在测试套件中注入一个字段:

val example = app.injector.instanceOf[Example]

所以你的初始代码是正确的方法,直接使用注射器混合。它可能看起来像这样:

class UserSpec extends PlaySpec with OneAppPerSuite 
               with BeforeAndAfter with AsyncAssertions {

  implicit val exec : ExecutionContext = app.injector.instanceOf[ExecutionContext]
  val db : DBConnectionPool = app.injector.instanceOf[DBConnectionPool]

  // ...

}

就自定义测试的DI绑定而言,您可以通过GuiceApplicationBuilder自定义应用实例来覆盖它们,请参阅Creating Application Instances for TestingTesting with Guice

答案 1 :(得分:0)

当你测试一个需要依赖注入的类时,这个类需要一个将对象注入这些类的应用程序。在测试中,您必须手动创建此应用程序。通过在测试套件的开头添加以下行来实现:

import play.api.inject.guice.GuiceApplicationBuilder
class UserSpec extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions {
  override def newAppForTest(td: TestData) = new GuiceApplicationBuilder().build()
  [...]

请注意,您可以使用特殊conf修改此应用程序以进行测试。请参阅the play documentation for more details

我为这个案例创建的应用程序很小而且开源。有关我如何实现此问题的更多详细信息,请参阅:https://github.com/gbersac/electricity_manager