我有一个锁定数据库行的服务方法。
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)
有谁知道这是什么?
答案 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
}