从2.2.4升级到Grails 2.4.3后,在单元测试期间测试之间不会重置元类更改

时间:2014-08-06 16:44:07

标签: unit-testing grails spock

我们正在尝试从Grails 2.2.4升级到2.4.3。在Grails 2.2.4中,如果我将GrailsUnitTestMixin包含在单元测试中,则在测试之间重置metaClass更改。在2.4.3中,这种行为似乎不再起作用了,我的测试失败了。在查看GrailsUnitTestMixin的最新代码时,我不再看到对MetaClassRegistryCleaner的引用。

自2.2.4以来这种行为是否有所改变?在测试后丢弃单元测试期间metaClass更改的适当方法是什么?

我知道Spock @ConfineMetaclassChanges注释用于限制特定更改的范围,但2.2.4中的先前行为更方便。

1 个答案:

答案 0 :(得分:4)

Grails 2.4.x中的单元测试支持已经过重构。 "What new in Grails 2.4"指南中有一些关于此的注释。文档位于unit testing guide

默认情况下,在每个测试类之后完成MetaClass清理。 源代码在 https://github.com/grails/grails-core/blob/master/grails-plugin-testing/src/main/groovy/grails/test/runtime/MetaClassCleanerTestPlugin.groovy

在Grails 2.4.3中,修复了影响Grails人工制品的元类清洁工作。以前这是在执行每个测试方法之后完成的: https://github.com/grails/grails-core/commit/1885351d2be8f74076f2c83edcbc048c5bcfd9d7

由于默认情况下Grails缓存了“测试运行时”实例,以便在单个测试类中执行所有测试,因此默认情况下,每个测试方法后都不会清除元类更改。

如果您想在测试类中的每个测试方法之后清除元类更改,则可以使用FreshRuntime注释来注释测试方法。应该支持将此注释添加到类级别,但Grails 2.4.3中的该功能目前已被破坏,而{2}中的the bug将在Grails 2.4.4中修复。这由以下提交修复: https://github.com/grails/grails-core/commit/27ceeb086baeb879c490f29f6d799cbd532c0772

总之,当前的解决方案是为每个测试方法添加FreshRuntime注释。在Grails 2.4.4中修复GRAILS-11626后,您可以在类级别使用注释。