无法使用MongoDB GORM插件在集成测试中持久保存实体

时间:2014-07-13 18:27:55

标签: mongodb grails grails-plugin gorm-mongodb

上下文: 我创建了一个名为AppDomain的新插件,其中包含Mongo 3.0.1插件。它有一个域类(Person)和一个集成测试(PersonSpec)。

问题: 正在生成id。 appdomain数据库和person集合正在Mongo中创建。但是,集成测试在收集计数中失败。

注意: 在查阅了我可以找到的所有文档并对生成的AppDomain插件代码进行了最小的更改之后,我不知道为什么这里包含的持久性测试失败了。我有一个类似的插件配置grails 2.2.2使用junit测试工作得很好。

感谢任何帮助。

package appdomain

class Person {
    String firstName
    String lastName
}

-

package appdomain

import grails.test.mixin.TestMixin
import grails.test.mixin.mongodb.*
import spock.lang.*

@TestMixin(MongoDbTestMixin)
class PersonSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "can persist a person to the appdomain mongo database"() {
        given: "a person"
        def aPerson = new Person(firstName: "Homer", lastName: "Simpson")

        when: "the person is saved"
        aPerson.save()

        then: "the person has an id"
        aPerson.id != null //Passes

        and: "the Person collection contains one item"
        Person.list().size() == 1 //Fails with Person.list().size() == 0
    }
}

1 个答案:

答案 0 :(得分:1)

GORM并不总是在您调用save后立即保留对象。

Official Reference

  

save方法通知持久化上下文一个实例   应该保存或更新。该对象不会被持久化   除非使用flush参数,否则立即使用。

因此,您应该立即调用save来刷新会话,以便更改立即生效。

. . .
when: "the person is saved"
        aPerson.save(flush:true)
. . .

有时,由于验证或其他非常见错误,保存失败(即使提供了flush:true)!如果您想在这些情况下获得例外,您还应该像这样添加failOnError:true

. . .
when: "the person is saved"
        aPerson.save(flush:true, failOnError:true)
. . .

Official Reference页面

中详细了解保存方法