hibernate - Grails 1.1 应用程序的集成测试在 Grails 2.0.3 中不起作用。会不会是 GORM 配置问题?

标签 hibernate grails grails-orm h2

我正在研究 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/

相关文章:

java - 如何在 hibernate 中重复嵌入类型

java - 预配置的 netbeans 项目与 NoSuchMethodError hibernate 和 spring 冲突

grails - 为什么未刷新的域对象在丢弃后不恢复到它们的 "saved"状态?我可以获得 "clean"版本吗?

hibernate - 是否可以在grails中进行sql注入(inject)

java - 如何使用 PostgreSQL 和 Hibernate 映射 Java 多维数组

java - HIbernate 在 Getter/Setter 中加密和解密?

grails - 通过发布Grails外部链接参数

hibernate - Groovy标准查询

java - java/grails中的服务器端网络打印

Grails - 无法为域类中的属性添加自定义验证器