Grails测试工厂类

时间:2014-10-23 16:43:07

标签: grails testing integration-testing

鉴于我是关于grails的新手,我试图测试工厂类。 Factory类位于src文件夹中,因为我不希望它作为服务。

class UserFactory {

static Map userDefaults = [
        email           : 'usermail@test.it',
        alias           : 'myalias',
        firstName       : 'Antonio',
        lastName        : 'Roma',
        password        : 'asdhjs',
        placeOfBirth    : 'Milan',
        placeOfResidence: 'Berlin',
        dateOfBirth     : new Date() - 4000
]

static User build(Map properties, Map options = [persisted: true]) {
    userDefaults.putAll properties
    def user = new User(userDefaults)

    if (options.persisted) { user.save() }

    return user
}

static Collection<User> build(Collection<Map> properties, Map options = [persisted: true]) {
    properties.collect { build(it, options) }
}

}

我想测试用户是否通过GORM正确创建和存储。这里集成测试:

@TestMixin(DomainClassUnitTestMixin)
class UserFactoryIntegrationSpec extends Specification {

def setup() {
    mockDomain(User)
}

def cleanup() {
}

void "create user"() {
    when:
    User user = UserFactory.build([alias: 'xx', email: 'xx@gmail.com'])

    then:
    User.count() == 1
    user.alias == 'xx'
    user.email == 'xx@gmail.com'
    user.id != null
}

void "create users"() {
    when:
    Collection<User> users = UserFactory.build([[alias: 'xx', email: 'xx@gmail.com'], [alias: 'yy', email: 'yy@gmail.com']])

    then:
    users.size() == 2
    users.alias == ['xx', 'yy']
    users.email == ['xx@gmail.com','yy@gmail.com']
    users.id != [null, null]
}

}

用户没有存储,我猜GORM没有正确加载...我错过了一些注释吗?!这里是测试应用程序集成的结果:UserFactoryIntegrationSpec

User.count() == 1
     |       |
     0       false

users.id != [null, null]
|     |  |
|     |  false
|     [null, null]
[rigel.resources.User : (unsaved), rigel.resources.User : (unsaved)]

1 个答案:

答案 0 :(得分:2)

你开始如此高调:

  

我想测试用户是否通过正确创建和存储   GORM。这里集成测试:

然而,由于你正在使用假装是集成测试的单元测试,所以这一切都变得很糟糕了,更糟糕的是,你用单元测试来测试持久性。

使用集成测试来测试持久性。只有在单元测试对您正在测试的内容有意义时才使用域类模拟,并且您希望强制域层以特定方式响应,以便您可以专注于控制器/服务/等。正在接受测试。

使用集成测试,它至少配置一个H2数据库,具有完整的ACID支持,行锁定,真正的SQL查询等。如果您愿意,可以将其切换为测试Oracle模式,MySQL数据库等等。但是您的测试会运行真实的查询和更新。如果你使用模拟来测试持久性,那么你真的只是测试模拟。

集成测试不使用mixins,模拟等。有一个真正的Spring ApplicationContext,Hibernate(或你正在使用的任何GORM),插件加载等。使用JUnit 3(扩展) GroovyTestCase)或JUnit 4(没有基类,使用JUnit注释)或Spock。请注意,集成测试将每个测试运行配置为在事务中发生,并且如果测试失败,则在成功测试结束时或之前回滚,但在任何一种情况下,测试之间都没有遗留。

如果你想使用Spock(你应该),那么为新版本的Grails扩展grails.test.spock.IntegrationSpec,默认为Spock测试。在旧版本中,安装spock插件并使用插件的集成基类。