如何在MongoDB上的Grails集成测试中回滚事务

时间:2013-04-17 02:04:01

标签: mongodb grails gorm

当使用MongoDB作为数据源时,我如何(应该)配置Grails集成测试以自动回滚事务? (我使用的是Grails 2.2.1 + mongodb插件1.2.0)

4 个答案:

答案 0 :(得分:2)

对于spock集成测试,我定义了一个MongoIntegrationSpec,它可以控制清理测试数据。

  • dropDbOnCleanup = true //将在执行每个要素方法后删除整个数据库。
  • dropDbOnCleanupSpec = true //将在规范完成后删除整个数据库。
  • dropCollectionsOnCleanup = [“collectionA”,“collectionB”,...] //在执行每个要素方法后删除集合。
  • dropCollectionsOnCleanupSpec = [“collectionA”,“collectionB”,...] //在规范完成后删除集合。
  • dropNewCollectionsOnCleanup = true //执行每个要素方法后,所有新集合都将被删除
  • dropNewCollectionsOnCleanupSpec = true //规范完成后,所有新集合都将被删除

这是来源

https://github.com/onetribeyoyo/mtm/tree/dev/src/test/integration/com/onetribeyoyo/util/MongoIntegrationSpec.groovy

该项目也有几个用法示例。

答案 1 :(得分:1)

我认为它甚至不可能,因为MongoDB不支持事务。您可以使用建议的static transactional = 'mongo',但只有在您没有刷新数据时才有用(我认为这种情况很少见)

相反,您可以手动清除setUp()上的数据库。您可以删除要测试的域的集合,例如:

MyDomain.collection.drop()

和(可选地)填写测试所需的所有数据。

答案 2 :(得分:0)

可以在static transactional = 'mongo'测试和/或integration课程中使用service。 有关详细信息,请参阅MongoDB Plugin

答案 3 :(得分:0)

MongoDB不支持交易!因此你不能使用它。你有的选择是

1。转而删除您使用的DomainClasses的集合。

MyDomain.collection.drop() //If you use mongoDB plugin alone without hibernate
MyDomain.mongo.collection.drop() //If you use mongoDB plugin with hibernate

退回是您必须为您使用的每个域执行此操作

2。删除整个数据库(你不需要明确地创建它,但你可以)

String host = grailsApplication.config.grails.mongo.host
Integer port = grailsApplication.config.grails.mongo.port
Integer databaseName = grailsApplication.config.grails.mongo.databaseName

def mongo = new GMongo(host, port)
mongo.getDB(databaseName).dropDatabase() //this takes 0.3-0.5 seconds in my machin

第二种选择更容易,更快捷。为了使这项工作适用于所有测试,请扩展IntegrationSpec并添加代码以删除清理块中的数据库(我假设您正在使用Spock测试框架)或者为JUnit执行类似测试的操作!

希望这有帮助!