2016-09-02 12 views
0

Slickでscalatestを使用すると、各テスト後にデータベースのクリーンアップの問題に直面しています。次のように定義されてテスト後のH2データベースのクローズまたはシャットダウン

class H2DatabaseService { 

    val db = Database.forConfig("h2mem1") 

    val questions = TableQuery[Question] 

    def createSchema = 
    db.run(questions.schema.create) 

    def getQuestionById(id: Long): Future[Option[QuestionEntity]] = 
    db.run(questions.filter(_.id === id).result.headOption) 

    def getQuestions: Future[Seq[QuestionEntity]] = 
    db.run(questions.result) 

    def insertQuestion(question: QuestionEntity): Future[Int] = 
    db.run(questions += question) 
} 

class Question(tag: Tag) extends Table[QuestionEntity](tag, "QUESTION") { 
    def id = column[Option[Long]]("QUESTION_ID", O.PrimaryKey, O.AutoInc) 
    def title = column[String]("TITLE") 

    def * = (id, title) <> ((QuestionEntity.apply _).tupled, QuestionEntity.unapply) 
} 

case class QuestionEntity(id: Option[Long] = None, title: String) { 
    require(!title.isEmpty, "title.empty") 
} 

そしてデータベース:

class H2DatabaseSpec extends WordSpec with Matchers with ScalaFutures with BeforeAndAfter { 
    implicit override val patienceConfig = PatienceConfig(timeout = Span(5, Seconds)) 

    val h2DB: H2DatabaseService = new H2DatabaseService 
    var db: Database = _ 

    before { 
    db = Database.forConfig("h2mem1") 
    h2DB.createSchema.futureValue 
    } 

    after { 
    db.shutdown.futureValue 
    } 

    "H2 database" should { 
    "query a question" in { 
     val newQuestion: QuestionEntity = QuestionEntity(Some(1L), "First question") 
     h2DB.insertQuestion(newQuestion).futureValue 

     val question = h2DB.getQuestionById(1L) 

     question.futureValue.get shouldBe newQuestion 
    } 
    } 

    it should { 
    "query all questions" in { 
     val newQuestion: QuestionEntity = QuestionEntity(Some(2L), "Second question") 
     h2DB.insertQuestion(newQuestion).futureValue 

     val questions = h2DB.getQuestions 

     questions.futureValue.size shouldBe 1 
    } 
    } 
} 

データベースサービスだけで定義されたデータベースにrunメソッドを呼び出している:ここでは

は、テストのコードである

h2mem1 = { 
    url = "jdbc:h2:mem:test1" 
    driver = org.h2.Driver 
    connectionPool = disabled 
    keepAliveConnection = true 
} 

私はScala 2.11.8、Slick 3.1.1、H2データベース1.4.192を使用しています。 t 2.2.6。

テスト実行時に表示されるエラーは、Table "QUESTION" already existsです。だから、shutdown()メソッドは全く効果がないようです(しかし、呼び出されます - デバッガでチェックされます)。

誰もこのようなシナリオをどのように処理するかを知っていますか?どのように各テスト後にデータベースを適切にクリーンアップするのですか?

答えて

0

異なるオブジェクトでメソッドを呼び出すため、データベースが正しくクリーンアップされませんでした。

H2DatabaseServiceは、それ自身のdbオブジェクトとテスト自体です。 H2データベースサービスのリファクタリング後に問題が修正され、次の呼び出しが行われました。

after { 
    h2DB.db.shutdown.futureValue 
} 
関連する問題