代码之家  ›  专栏  ›  技术社区  ›  Felipe

Play+Scala测试Slick数据库

  •  1
  • Felipe  · 技术社区  · 7 年前

    我正在尝试为我的项目创建一个使用Play2.6和Scala2.12的测试类。我已导入scalatest库:

    libraryDependencies += guice
    libraryDependencies += evolutions
    libraryDependencies += jdbc
    libraryDependencies += filters
    
    libraryDependencies += "com.h2database" % "h2" % "1.4.194"
    libraryDependencies += "com.typesafe.play" %% "anorm" % "2.5.3"
    libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.0" % Test
    libraryDependencies += "org.scala-lang" % "scala-actors" % "2.10.0-M7" % "test"
    libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.4"
    libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.4" % "test"
    
    libraryDependencies += "com.typesafe.play" %% "play-slick" % "3.0.0"
    libraryDependencies += "com.typesafe.play" %% "play-slick-evolutions" % "3.0.0"
    libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.19.3"
    

    我的编译器说ShouldMatchers在scalatest库中不存在。

    class RackRepositorySpec extends PlaySpec with GuiceOneAppPerTest with Injecting {
    
      val database = Databases(
        driver = "org.sqlite.JDBC",
        url = "jdbc:sqlite:development.db",
        name = "default",
        config = Map(
          "username" -> "",
          "password" -> ""
        )
      )
      val guice = new GuiceInjectorBuilder()
        .overrides(bind[Database].toInstance(database))
        .injector()
      val defaultDbProvider = guice.instanceOf[DatabaseConfigProvider]
    
      def beforeAll() = Evolutions.applyEvolutions(database)
      def afterAll() = {
        // Evolutions.cleanupEvolutions(database)
        database.shutdown()
      }
    
      Evolution(
        1,
        "create table test (id bigint not null, name varchar(255));",
        "drop table test;"
      )
    }
    

    我得到了Scalatest的最新版本,但这个类似乎已经不存在了。我遵循以下示例: https://dzone.com/articles/getting-started-play-21-scala 有没有人能再举一个例子来为Slick in-memory数据库构建Scala测试?

    [info] RackRepositorySpec:
    [info] models.RackRepositorySpec *** ABORTED ***
    [info]   com.google.inject.ConfigurationException: Guice configuration errors:
    [info] 
    [info] 1) No implementation for play.api.db.slick.DatabaseConfigProvider was bound.
    [info]   while locating play.api.db.slick.DatabaseConfigProvider
    [info] 
    [info] 1 error
    [info]   at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1045)
    [info]   at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
    [info]   at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1054)
    [info]   at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:409)
    [info]   at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:404)
    [info]   at play.api.inject.ContextClassLoaderInjector.$anonfun$instanceOf$2(Injector.scala:117)
    [info]   at play.api.inject.ContextClassLoaderInjector.withContext(Injector.scala:126)
    [info]   at play.api.inject.ContextClassLoaderInjector.instanceOf(Injector.scala:117)
    [info]   at models.RackRepositorySpec.<init>(RackRepositorySpec.scala:26)
    [info]   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    

    谨致问候, 费利佩

    2 回复  |  直到 7 年前
        1
  •  1
  •   joesan    7 年前

    我确实在我的一个Scala项目中使用了Slick,我的数据库是Postgress。为了进行单元测试,我在内存中创建了一个测试h2数据库,该数据库在单元测试期间填充,并在测试完成后删除。

    您可以在此处查看示例:

    https://github.com/joesan/plant-simulator/blob/master/test/com/inland24/plantsim/services/database/PowerPlantDBServiceSpec.scala

    我还想做的是实现某种自动化,在iI中希望填充h2数据文件,并将其永久保存到下一个单元测试周期。

        2
  •  1
  •   Kraylog    7 年前

    ShouldMatchers 已在版本2中弃用,并在版本3中删除。使用 Matchers MustMatchers 相反

    请参见 release notes .

    推荐文章