2016-09-08 2 views
0

私は、Playアプリケーションコンテキスト(H2を使用)を通してすべてを起動して実行することなく、Slick Playアプリケーションをテストしようとしています。これは、私がH2接続を共有し、前もって多くのテストDB準備をしたいからです。DatabaseConfigProviderのインプリメンテーションを作成する

これを行うには、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 
} 

DatabaseConfigProviderの実装を行うためのScalaでのトリックは何ですか? Slick/Playのコードベースを見ると、そのような具体的な実装の例はありません。

答えて

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]] 
    } 
} 
関連する問題