在 grails 4.0.5 中,将数据源定义移动到 runtime.groovy 会导致在测试期间不创建数据库
In grails 4.0.5, moving datasource definition to runtime.groovy causes DB not to be created during tests
我需要将数据源的配置移动到 runtime.groovy,因为该配置代码需要访问我的一些 类。
在以前的 grails 版本中,这不是问题。但是我发现,如果我将环境块和默认数据源块移动到 runtime.groovy,Hibernate 将不会创建数据库,并且我的功能测试显然会失败。
这是我从 application.yml 中删除的配置:
hibernate:
cache:
queries: false
use_second_level_cache: false
use_query_cache: false
dataSource:
pooled: true
jmxExport: true
driverClassName: org.h2.Driver
username: sa
password: ''
environments:
development:
grails.plugin.console.csrfProtection.enabled: false
dataSource:
dbCreate: create-drop
url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
test:
dataSource:
dbCreate: update
url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
production:
hibernate:
jdbc:
use_get_generated_keys: true
在我的 runtime.groovy 中是这样的:
hibernate {
cache {
queries = false
use_second_level_cache = false
use_query_cache = false
}
}
dataSource {
pooled = true
jmxExport = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
environments {
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
test {
dataSource {
dbCreate: "update"
url: "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
production {
hibernate {
jdbc {
use_get_generated_keys = true
}
}
dataSource {
//production datasource setup irrelevant
}
}
我尝试了组合,将一些放在 application.yml 中,将一些放在 application.groovy 中,全部放在 runtime.groovy 中。将测试和开发部分保留在 application.yml 中,将 运行 特定时间的环境保留在 runtime.groovy 中也不起作用。
似乎没有任何效果。
我不能就这样离开,因为我的生产模式需要能够连接一个秘密存储来设置生产数据源。
新版本的 grails 是否遗漏了一些隐藏的开关?
补充说明,以下命令有效(服务器启动):
./grailsw -Dgrails.env=dev run-app
./grailsw -Dgrails.env=test run-app
./gradlew shell -q
当我 运行 这个时,测试失败抱怨缺少表格:
./grailsw -Dgrails.env=test test-app
失败的测试继承自 GebSpec,因为它们是完整的功能测试,需要 运行 针对控制器。
因此,当 运行 进行功能测试时,如果我将配置从 application.yml?
移开,Hibernate 似乎没有正确初始化
谢谢
最终更新
正如 Jeff 所指出的,我的代码中有一个拼写错误。谢谢杰夫!
您为 runtime.groovy
显示的配置应该在 grails-app/conf/application.groovy
中(不需要是 runtime.groovy
)。你的配置问题是你有这个:
test {
dataSource {
dbCreate: "update"
url: "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
你在应该有等号的地方有冒号,像这样:
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
我需要将数据源的配置移动到 runtime.groovy,因为该配置代码需要访问我的一些 类。
在以前的 grails 版本中,这不是问题。但是我发现,如果我将环境块和默认数据源块移动到 runtime.groovy,Hibernate 将不会创建数据库,并且我的功能测试显然会失败。
这是我从 application.yml 中删除的配置:
hibernate:
cache:
queries: false
use_second_level_cache: false
use_query_cache: false
dataSource:
pooled: true
jmxExport: true
driverClassName: org.h2.Driver
username: sa
password: ''
environments:
development:
grails.plugin.console.csrfProtection.enabled: false
dataSource:
dbCreate: create-drop
url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
test:
dataSource:
dbCreate: update
url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
production:
hibernate:
jdbc:
use_get_generated_keys: true
在我的 runtime.groovy 中是这样的:
hibernate {
cache {
queries = false
use_second_level_cache = false
use_query_cache = false
}
}
dataSource {
pooled = true
jmxExport = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
environments {
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
test {
dataSource {
dbCreate: "update"
url: "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
production {
hibernate {
jdbc {
use_get_generated_keys = true
}
}
dataSource {
//production datasource setup irrelevant
}
}
我尝试了组合,将一些放在 application.yml 中,将一些放在 application.groovy 中,全部放在 runtime.groovy 中。将测试和开发部分保留在 application.yml 中,将 运行 特定时间的环境保留在 runtime.groovy 中也不起作用。
似乎没有任何效果。
我不能就这样离开,因为我的生产模式需要能够连接一个秘密存储来设置生产数据源。
新版本的 grails 是否遗漏了一些隐藏的开关?
补充说明,以下命令有效(服务器启动):
./grailsw -Dgrails.env=dev run-app
./grailsw -Dgrails.env=test run-app
./gradlew shell -q
当我 运行 这个时,测试失败抱怨缺少表格:
./grailsw -Dgrails.env=test test-app
失败的测试继承自 GebSpec,因为它们是完整的功能测试,需要 运行 针对控制器。
因此,当 运行 进行功能测试时,如果我将配置从 application.yml?
移开,Hibernate 似乎没有正确初始化谢谢
最终更新 正如 Jeff 所指出的,我的代码中有一个拼写错误。谢谢杰夫!
您为 runtime.groovy
显示的配置应该在 grails-app/conf/application.groovy
中(不需要是 runtime.groovy
)。你的配置问题是你有这个:
test {
dataSource {
dbCreate: "update"
url: "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
你在应该有等号的地方有冒号,像这样:
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}