Hibernate Grails1.1应用程序的集成测试不适用于Grails2.0.3。这可能是GORM配置问题吗?

Hibernate Grails1.1应用程序的集成测试不适用于Grails2.0.3。这可能是GORM配置问题吗?,hibernate,grails,gorm,h2,Hibernate,Grails,Gorm,H2,我正在研究史密斯和莱德布鲁克的《圣杯行动》。本书中的示例是针对Grails1.1和Hibernate1.1编写的(根据下载的源代码的application.properties) 其中一个例子是“hubbub”,我的机器上有Grails2.0.3。我用“GrailsCreateAppHubbub”创建了我自己的应用程序副本,用grails命令创建了我的域类和测试,然后在书中输入了源代码。换句话说,我并不是要运行在Grails2.0.3环境中使用Grails1.1生成的源代码树。Grails2.0

我正在研究史密斯和莱德布鲁克的《圣杯行动》。本书中的示例是针对Grails1.1和Hibernate1.1编写的(根据下载的源代码的application.properties)

其中一个例子是“hubbub”,我的机器上有Grails2.0.3。我用“GrailsCreateAppHubbub”创建了我自己的应用程序副本,用grails命令创建了我的域类和测试,然后在书中输入了源代码。换句话说,我并不是要运行在Grails2.0.3环境中使用Grails1.1生成的源代码树。Grails2.0.3生成的所有配置和类对于示例来说都不是唯一的。我只是在示例中输入了一小部分源代码,这些源代码最初不是由Grails生成的

这是我的问题-其中一个集成测试使用save()方法来持久化对象。当我运行测试时,它只包含一个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()方法的类:

下面是对用户调用save()的集成测试:

这是我生成的DataSource.groovy中的数据配置(为了简洁起见,除测试外,所有环境都已编辑):

这是这本书的原件:

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,而Grails2.0.3使用的是org.h2.driver。另一个主要区别是原始数据源url是jdbc:hsqldb:mem:testDb,而新的是jdbc:h2:mem:testDb;MVCC=真。最后,指定的缓存机制差别很大


这可能是一个配置问题,与h2和hsqldb之间的差异有关吗?如果是这样的话,我最好去哪里了解我需要做什么才能让它工作呢?

在Grails2中,你不应该在集成测试中扩展
GrailsUnitTestCase
,把它改成
GroovyTestCase
,你应该解决这个问题


这失败了,因为
GrailsUnitTestCase
认为这是一个必须从域对象中模拟(然后拆除并删除)GORM方法的单元测试。它没有意识到它有真正的方法,不是模仿。

谢谢。它现在正在工作。既然您已经指出了这一点,在从单元测试类派生的类中运行集成测试似乎很奇怪,但我会浪费大量时间尝试重新配置Hibernate,而且我从来没有注意到这一点。
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 {
    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 {
            ...
        }
    }
}