Configuração adequada de H2 com Scala Slick para teste

Usar H2 no banco de dados de memória para executar testes eficientes é tentador, mas se você usar uma configuração ingênua, terá exceções muito estranhas, como Column "X2.bar" not found;ou Table "foo" not found; SQL statement:.

Existem duas causas para essas exceções e muito provavelmente não é um erro em seu código, mas apenas um truque de configuração que você esqueceu. Acabei encontrando a solução em um (não) relatório de bug no slick .

O primeiro problema é que se você criar as tabelas em uma sessão e executar seus testes em outra sessão, algo como:

test("Foo should Bar") {

val conn
= SlickDatabase.forURL("jdbc:h2:mem:test", driver = "org.h2.Driver")

conn
.withSession {
import scala.slick.session.Database.threadLocalSession
val t
= MyTable
t
.ddl.create
}

Foo.bar(conn) should be("foobar")
}

onde usa sua própria sessão para executar coisas. O banco de dados na memória viverá apenas enquanto a primeira sessão, então a chamada verá um “novo” banco de dados vazio. Para contornar isso, você precisa dizer ao H2 para manter o banco de dados na memória enquanto a JVM durar e não enquanto a sessão durar:Foo.barFoo.bar

val conn = SlickDatabase.forURL("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")

Isso contornará a primeira exceção, mas o código não funcionará imediatamente se você usar nomes em minúsculas para sua tabela e colunas, pois H2 tende a colocar tudo em maiúsculas por padrão. É aí que descobrir o que está acontecendo não é fácil. A solução é simples, porém, você precisa dizer ao H2 para não colocar o mundo em letras maiúsculas:Table not found

val conn = SlickDatabase.forURL("jdbc:h2:mem:test;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")