Grails spock数据库锁定

时间:2014-04-08 10:04:55

标签: grails spock

我有一个锁定数据库行的服务方法。

public String getNextPath() {
    PathSeed.withTransaction { txn ->
        def seed = PathSeed.lock(1)
        def seedValue = seed.seed
        seed.seed++
        seed.save()
    }

}

这就是我的spock测试的样子:

void "getNextPath should return a String"() {
    when:
        def path = pathGeneratorService.getNextPath()

    then:
        path instanceof String
}

这只是一个简单的初步测试。但是,当我运行测试时出现此错误:

java.lang.UnsupportedOperationException: Datastore [org.grails.datastore.mapping.simple.SimpleMapSession] does not support locking.
at org.grails.datastore.mapping.core.AbstractSession.lock(AbstractSession.java:603)
at org.grails.datastore.gorm.GormStaticApi.lock_closure14(GormStaticApi.groovy:343)
at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:302)
at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:37)
at org.grails.datastore.gorm.GormStaticApi.lock(GormStaticApi.groovy:342)
at com.synacy.PathGeneratorService.getNextPath_closure1(PathGeneratorService.groovy:10)
at org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:712)
at com.synacy.PathGeneratorService$$EOapl2Cm.getNextPath(PathGeneratorService.groovy:9)
at com.synacy.PathGeneratorServiceSpec.getNextPath should return a String(PathGeneratorServiceSpec.groovy:17)

有谁知道这是什么?

2 个答案:

答案 0 :(得分:2)

单元测试的简单GORM实现不支持某些功能,例如锁定。将测试移至集成测试将使用GORM的完整实现,而不是单元测试使用的简单实现。

通常,当您发现自己使用的不仅仅是GORM的基本功能时,您需要使用集成测试。

2014年10月6日更新

在最新版本的Grails和GORM中,现在有HibernateTestMixin允许您在单元测试中测试/使用此类功能。有关详细信息,请参阅documentation

答案 1 :(得分:1)

作为一种解决方法,我能够通过使用Groovy元编程来实现它。适用于您的示例:

def setup() { // Current spec does not test the locking feature, // so for this test have lock call the get method // instead. PathSeed.metaClass.static.lock = PathSeed.&get }