Play2 アプリで db 統合テストを作成する方法を見つけようとしています。
私の conf ファイルでは、通常使用する xxx_test とテスト用の h2 db の 2 つのデータベースを指定しました。
db.xxx_test.driver=com.mysql.jdbc.Driver
db.xxx_test.url="jdbc:mysql://localhost/xxx_test?characterEncoding=UTF-8"
db.xxx_test.user="root"
db.xxx_test.password=""
db.h2.driver=org.h2.Driver
db.h2.url="jdbc:h2:mem:play"
db.h2.user=sa
db.h2.password=""
User オブジェクトxxx_test
で、アプリケーションの実行時に使用するように指定しました。
def createUser(user: User): Option[User] = {
DB.withConnection("xxx_test") {
implicit connection =>
SQL("insert into users(first_name, last_name, email, email_validated, last_login, created, modified, active) values({first_name},{last_name},{email},{email_validated},{last_login}, {created}, {modified}, {active})").on(
'first_name -> user.firstName,
'last_name -> user.lastName,
'email -> user.email,
'email_validated -> user.emailValidated,
'last_login -> user.lastLogin,
'created -> user.created,
'modified -> user.modified,
'active -> true
).executeInsert().map(id => {
return Some(User(new Id[Long](id), user.firstName, user.lastName, user.email, user.emailValidated, user.lastLogin, user.created, user.modified, true))
}
)
}
None
}
私のテストでは、新しい inMemoryDatabase を作成し、ユーザーを使用してテスト用のオブジェクトを作成および取得します。
class DBEvolutionsTest extends Specification {
"The Database" should {
"persist data properly" in {
running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
User.create(User(Id[Long](1L), "jakob",
"aa",
"aaa",
true,
DateTime.now(),
DateTime.now(),
DateTime.now(),
true))
val newUser = User.findBy(Id[Long](1L))
newUser.get.firstName must beEqualTo("jakob")
}
}
}
}
User オブジェクトはデータベースxxx_test
ではなく
を使用するため、これはもちろん正しい方法ではありません。User( ) オブジェクトh2
で db を指定したため、テストではメモリ内ではなく実際の db にユーザーが作成されます。DB.withConnection("xxx_test")
これを行うスマートな方法があると思います。アプリケーションのようにデータベース名を渡したくありませんUser.create(User(...), "xxx_test")
この問題をどのように解決しましたか?