在 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"
    }
}