tôi đã có cuộc đấu tranh đó và tôi đã đưa ra một giải pháp như thế này (sử dụng cách tiếp cận thứ hai):
Tạo một bối cảnh cho DAO để sử dụng:
trait BaseContext{
def dbName: String
val dbConfig = DatabaseConfigProvider.get[JdbcProfile](dbName)
val db = dbConfig.db
val profile = dbConfig.driver
val tables = new Tables { // this is generated by Schema Code Generator
override val profile: JdbcProfile = dbConfig.driver
}
}
@Singleton
class AppContext extends BaseContext{
def dbName = "mysql" // name in your conf right after "slick.dbs"
}
@Singleton
class TestingContext extends BaseContext{
def dbName = "h2"
}
Sau đó tạo một module để ràng buộc tiêm, và đừng quên để kích hoạt nó trong conf sử dụng play.modules.enabled += "your.Module"
:
class ContextModule(environment: Environment, configuration: Configuration) extends AbstractModule {
override def configure(): Unit = {
if (configuration.getString("app.mode").contains("test")) {
bind(classOf[BaseContext])
.to(classOf[TestingContext])
} else {
bind(classOf[BaseContext])
.to(classOf[AppContext])
}
}
}
và tiêm nó vào mỗi DAO bạn đã tạo:
class SomeDAO @Inject()(context: BaseContext){
val dbConfig = context.dbConfig
val db = context.db
val tables = context.tables
import tables.profile.api._
def otherStuff....
// you can call db.run(...), tables.WhateverYourTableIs, tables.TableRowCaseClass, ...
}
Và bước cuối cùng, tệp cấu hình của bạn. Trong trường hợp của tôi, tôi đã sử dụng app.mode
để đánh dấu môi trường và tôi sử dụng riêng biệt .conf
cho môi trường khác nhau. Nguyên nhân, trong những conf bạn phải có cấu hình DB chính xác. Đây là mẫu:
app.mode = "test"
# Database configuration
slick.dbs = {
# for unit test
h2 {
driver = "slick.driver.H2Driver$"
db = {
url = "jdbc:h2:mem:test;MODE=MYSQL"
driver = "org.h2.Driver"
keepAliveConnection = true
}
}
}
Tôi khá chắc chắn giải pháp của tôi không phải là một thanh lịch, nhưng nó cung cấp hàng hóa. :) Bất kỳ giải pháp nào tốt hơn đều được hoan nghênh!
'Bước' này là gì? Từ khóa không dễ tìm kiếm. – JulienD
Rất có thể chức năng từ specs2, cho phép bạn chạy những thứ nhất định trước và/hoặc sau khi kiểm tra. Tương tự như những gì bạn sẽ sử dụng một 'beforeAll' /' afterAll' cho. – rethab