2016-09-02 2 views
0

Ich stehe nach jedem Test bei der Verwendung von Scalatest mit Slick einem Problem der Datenbankbereinigung gegenüber.Schließen oder Herunterfahren der H2-Datenbank nach Tests funktioniert nicht

Hier ist der Code des Tests:

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 
    } 
    } 
} 

Database Service nur run Methode definiert Datenbank aufruft:

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") 
} 

und die Datenbank wird wie folgt definiert:

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

Ich benutze Scala 2.11.8, Slick 3.1.1, H2 Datenbank 1.4.192 und skaliert t 2.2.6.

Fehler beim Ausführen der Tests ist Table "QUESTION" already exists. So sieht es aus wie shutdown() Methode hat überhaupt keine Wirkung (aber es wird aufgerufen - im Debugger eingecheckt).

Jeder weiß, wie mit einem solchen Szenario umzugehen ist? Wie bereinigt man die Datenbank nach jedem Test?

Antwort

0

Die Datenbank wurde nicht ordnungsgemäß bereinigt, da die Methode für ein anderes Objekt aufgerufen wurde.

H2DatabaseService hat seine eigenen db Objekt und der Test ist es eigene. Das Problem wurde nach dem Refactoring des H2-Datenbankservices und dem Aufruf behoben:

after { 
    h2DB.db.shutdown.futureValue 
} 
Verwandte Themen