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.bar
Foo.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")