【问题标题】:Creating Implementation of DatabaseConfigProvider创建 DatabaseConfigProvider 的实现
【发布时间】:2017-01-16 11:05:30
【问题描述】:

我正在尝试测试 Slick Play 应用程序,而无需通过 Play 应用程序上下文(使用 H2)启动和运行所有内容。这是因为我想共享 H2 连接并事先做大量的测试数据库准备。

为此,我需要一个DatabaseConfigProvider 实现。在这种情况下,我需要一个 JdbcProfile 配置。我正在扩展的特征是:

trait DatabaseConfigProvider {
  def get[P <: BasicProfile]: DatabaseConfig[P]
}

但是,我无法获得DatabaseConfigProvider 的类型检查方法的签名。

class TestDbProvider(config:DatabaseConfig[JdbcProfile]) extends DatabaseConfigProvider {
  def get[P <: BasicProfile]: DatabaseConfig[P] = config
}

上述实现以及许多其他变体都失败了。

[error] RepositoryTest.scala:78: type mismatch;
[error]  found   : slick.backend.DatabaseConfig[slick.driver.JdbcProfile]
[error]  required: slick.backend.DatabaseConfig[P]
[error]     def get[P <: BasicProfile]: DatabaseConfig[P] = config
[error]                                                     ^
[error] one error found
[error] (api/test:compileIncremental) Compilation failed

更多坏变种:

// Fails
class TestDbProvider(config:DatabaseConfig[JdbcProfile]) extends DatabaseConfigProvider {
  def get[P <: BasicProfile]: DatabaseConfig[JdbcProfile] = config
}

// Fails
class TestDbProvider[P <: BasicProfile](config:DatabaseConfig[P]) extends DatabaseConfigProvider {
  def get[P]: DatabaseConfig[P] = config
}

// Fails
class TestDbProvider(config:DatabaseConfig[JdbcProfile]) extends DatabaseConfigProvider {
  def get[JdbcProfile]: DatabaseConfig[JdbcProfile] = config
}

Scala 中实现DatabaseConfigProvider 的诀窍是什么?翻看 Slick/Play 的代码库,没有这样具体实现的例子。

【问题讨论】:

    标签: scala unit-testing playframework h2


    【解决方案1】:

    如果不使用强制转换,我们无论如何都无法完成这项工作。这是我的实现:

    def toProvider(dbIn: PostgresDriver.backend.DatabaseDef) = {
    
        new DatabaseConfig[JdbcProfile] {
    
          override def db: JdbcProfile#Backend#Database = dbIn
          override def config: Config = None.orNull // unused
          override def driverIsObject: Boolean = true
          override def driverName: String = "org.postgresql.Driver"
          override val driver: JdbcProfile = ExtendedPostgresDriver
        }
    
        new DatabaseConfigProvider {
          // Cast is necessary, otherwise cannot get to compile
          override def get[P <: BasicProfile]: DatabaseConfig[P] = config.asInstanceOf[DatabaseConfig[P]]
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-22
      • 2019-11-01
      • 2022-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多