我正在研究 Smith 和 Ledbrook 的Grails in Action。书中的示例是针对 Grails 1.1 和 Hibernate 1.1 编写的(根据下载源的 application.properties)。
其中一个例子是“hubbub”。我的机器上有 Grails 2.0.3。我使用“grails create-app hubbub”创建了我自己的应用程序副本,使用 Grails 命令创建了我的域类和测试,然后输入了书中的源代码。换句话说,我并不想在 Grails 2.0.3 环境中运行使用 Grails 1.1 生成的源代码树。 Grails 2.0.3 生成了并非示例所独有的所有配置和类。我只是在示例中输入了少量最初不是由 Grails 生成的源代码。
这是我的问题 - 其中一个集成测试使用 save() 方法来保存对象。当我运行测试时,它只包含一个 save(),它成功了。但是,如果测试包含多个 save() 方法,第一个之后对 save() 的所有调用都会失败,并显示:
| Failure: testSaveAndUpdate(com.grailsinaction.UserIntegrationTests)
| groovy.lang.MissingMethodException: No signature of method:
com.grailsinaction.User.save() is applicable for argument
types: () values: []
Possible solutions: save(), save(boolean), save(java.util.Map), wait(),
any(), wait(long)
at
com.grailsinaction.UserIntegrationTests.testSaveAndUpdate
(UserIntegrationTests.groovy:46)
我重新安排了对 save() 的调用,第一个调用始终有效,而后续调用始终失败。我已经注释掉了测试来运行每个调用以自行保存,并且每个测试都可以自行成功。
这是我调用 save() 方法的类:
package com.grailsinaction
class User {
String userId
String password
String homepage
Date dateCreated
static constraints = {
userId(size: 3..20, unique: true)
password(size: 6..8)
homepage(url: true, nullable: true)
}
这是对用户调用 save() 的集成测试:
package com.grailsinaction
import grails.test.*
class UserIntegrationTests extends GrailsUnitTestCase {
void testFirstSaveEver() {
def user = new User(userId: 'joe', password: 'secret',
homepage: 'http://www.grailsinaction.com')
assertNotNull user.save()
assertNotNull user.id
def foundUser = User.get(user.id)
assertEquals 'joe', foundUser.userId
}
void testSaveAndUpdate() {
def user = new User(userId: 'joe', password: 'secret',
homepage: 'http://www.grailsinaction.com')
assertNotNull user.save()
def foundUser = User.get(user.id)
foundUser.password = 'sesame'
foundUser.save()
def editedUser = User.get(user.id)
assertEquals 'sesame', editedUser.password
}
}
这是我生成的 DataSource.groovy 中的数据配置(为了简洁起见,所有环境都被编辑掉了):
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
...
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb;MVCC=TRUE"
}
}
production {
dataSource {
...
}
}
}
}
以下是本书的原文:
dataSource {
pooled = true
driverClassName = "org.hsqldb.jdbcDriver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache=true
cache.use_query_cache=true
cache.provider_class='com.opensymphony.oscache.hibernate.OSCacheProvider'
}
// environment specific settings
environments {
development {
dataSource {
...
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:hsqldb:mem:testDb"
}
}
production {
dataSource {
...
}
}
}
最大的区别是原始驱动程序是 org.hsqldb.jdbcDriver,而 Grails 2.0.3 使用的是 org.h2.Driver。另一个主要区别是原始数据源 url 是 jdbc:hsqldb:mem:testDb,而新数据源 url 是 jdbc:h2:mem:testDb;MVCC=TRUE。最后,指定的缓存机制有很大不同。
这是否是一个配置问题,必须对 h2 和 hsqldb 之间的差异进行处理?如果是这样,我应该去哪里了解我需要做什么才能使其正常工作?
最佳答案
在 grails 2 中,您不应该在集成测试中扩展 GrailsUnitTestCase
,将其更改为 GroovyTestCase
就可以解决问题。
这会失败,因为 GrailsUnitTestCase
认为这是一个单元测试,必须从域对象中模拟(然后拆除并删除)GORM 方法。它没有意识到它有真正的方法,而不是模拟方法。
关于hibernate - Grails 1.1 应用程序的集成测试在 Grails 2.0.3 中不起作用。会不会是 GORM 配置问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10661763/