Hibernate Grails没有';在Spock的setupSpec()中不允许GORM,但setup()发生在where之后

Hibernate Grails没有';在Spock的setupSpec()中不允许GORM,但setup()发生在where之后,hibernate,grails,groovy,spock,Hibernate,Grails,Groovy,Spock,在Grails应用程序的Spock单元测试中,我试图创建一些模拟域对象,这些对象将在Spock测试类中的功能方法之间使用 听起来像是setupSpec()块的工作,对吗?嗯: class MyServiceSpec extends Specification { def setupSpec() { def author = new Author([name: "Bob"]) def author2 = new Author([name: "Sally"])

在Grails应用程序的Spock单元测试中,我试图创建一些模拟域对象,这些对象将在Spock测试类中的功能方法之间使用

听起来像是setupSpec()块的工作,对吗?嗯:

class MyServiceSpec extends Specification {
    def setupSpec() {
        def author = new Author([name: "Bob"])
        def author2 = new Author([name: "Sally"])
        def author3 = new Author([name: "Alice"])
        def book1 = new Book([name: "My Story", author: author])
        def book2 = new Book([name: "My Favorite Stories", author: author2])
        def book3 = new Book([name: "My Least Favorite Stories", author: author3])
    }

    def "test my feature method"() {
        setup:
            def variable = service.myMethod(author, book)
        expect:
            //some relevant expectation
        where:
            //I'm using combinations() so I can test every possible combination of authors and books with my feature method
            [author, book] << [Author.list() + [null], Book.list() + [null]].combinations()
    }
}
然后在setupSpec中,我可以

def setupSpec()
    mockDomain(Author, [[name: "Bob"], [name: "Sally"], [name: "Alice"]])
这有点不方便,因为这样创建书籍比较困难,因为Author对象不绑定到变量

这种方法的真正问题是,即使我使用Author.get(1)暴力查找作者,在以后的特性方法中,查找者也无法找到对象。简而言之,它们不会持久化到Grails单元测试提供的最小hibernate实例

在feature方法之前使用Spock注释运行安装程序 接下来,我尝试添加一个注释,该注释应该允许您指定“嘿,在这个特定的feature方法之前,运行另一个方法。”

在BuildConfig.groovy中:

    mavenRepo "http://dl.bintray.com/content/noamt/java-libraries/"
    //...
    compile 'org._10ne.spock:spock-extensions:1.0'
然后,我将原始setupSpec()块更改为featureSetup(),并使用

@BeforeFeatureSetupExtensionAnnotation('featureSetup')
def "test my feature method"() {
....
如果我这样做,我会得到与以前相同的错误,每个特征方法只有一次错误:

失败:测试我的特性方法(com.my.package.MyServiceSpec) hibernate.HibernateException:没有绑定到线程的hibernate会话,并且配置不允许在此创建非事务会话 com.my.package.MyServiceSpec.featureSetup(MyServiceSpec.groovy:17)


服务、数据库。。。这不应该是一个集成测试吗?Grails中的单元测试应该有一个GORM的轻型实例,您可以使用它来模拟这样的测试数据。事实上,GORM是有效的,只是在setupSpec()块中不起作用。虽然我肯定会对这个应用程序的更广泛部分进行集成测试,但我不认为对一个与您的域交互的方法进行单元测试是一种不好的测试理念。我从未想过如何使它工作,即使是对于集成测试。格雷姆本人并没有给我希望。
@BeforeFeatureSetupExtensionAnnotation('featureSetup')
def "test my feature method"() {
....