【发布时间】:2015-02-10 08:28:38
【问题描述】:
救命!
我们的插件项目集成测试应该命中 datasource.groovy 中指定的数据库,但出于某种原因他们忽略了它,并在内存中进行。
它是一个插件,为多个 grails 应用程序提供核心服务(即数据库访问),每个应用程序都是一个 grails 应用程序。
Datasource.groovy 看起来像这样:
dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
dialect = "org.hibernate.dialect.MySQL5InnoDBDialect"
}
environments {
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:mysql://127.0.0.1:3306/db"
username = "someuser"
password = "somepass"
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:mysql://127.0.0.1:3306/db"
username = "someuser"
password = "somepass"
}
}
production {
dataSource {
}
}
}
测试 (SiteIntegrationSpec.goovy)
import grails.test.mixin.TestFor
import grails.test.spock.IntegrationSpec
@TestFor(Site)
class SiteIntegrationSpec extends IntegrationSpec {
static transactional = false
def setup() {
}
def cleanup() {
}
void "test something"() {
when:
Site site
site = new Site(name: "asdf", description: "asdfsd").save(failOnError: true)
then:
site.id == 3
when:
Site site2 = Site.get(1L)
then:
site2.name == "root"
}
}
站点表中已存在的数据: 身份证名称说明 1根根 2 测试测试
第一个测试应该插入一个 ID 为 3 的记录。它实际上插入了一个 ID 为 1 的记录,即它没有看到或访问测试数据库,它使用了一些未定义的模拟或内部数据库任何地方。
第二个测试失败,因为它不是检索“root”而是检索“asdf”
我尝试过的:
- 为测试创建单独的数据库。没有帮助。
- 在运行测试时指定 -Dgrails.env=test。没有帮助
- 在 DB 关闭的情况下运行测试。这正确失败,无法创建池类型异常。
- 将测试数据源密码更改为不正确的密码 - 这会正确引发异常。
- grails -Dgrails.env=test test-app com.me.myproject.SiteIntegrationSpec --stacktrace --verbose
所以 grails 正在连接到测试数据源,但是集成测试没有使用它!
有什么想法吗?
编辑:站点是域对象:
class Site {
String name
String description
}
【问题讨论】:
-
什么是“网站”?我看到你使用
@TestFor(Site),我已经将它用于控制器和服务,但在你的情况下,它看起来像一个域对象。如果你想模拟一个域对象,你可以试试@Mock(Site)吗? -
对不起,Site 只是一个域对象,有两个属性:名称和描述
标签: grails datasource integration-testing