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

Ste*_*rix 2 grails unit-testing spock

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

自 2.2.4 以来此行为是否发生了变化?确保单元测试期间元类更改在测试后被丢弃的适当方法是什么?

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

Lar*_*ari 5

Grails 2.4.x 中的单元测试支持已被重构。“Grails 2.4 中的新增功能”指南中有一些关于此的注释。文档位于单元测试指南中。

默认情况下,元类清理是在每个测试类之后完成的。源代码位于 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 中已被破坏,并且该错误将在 Grails 2.4.4 中修复。此提交修复了此问题: https://github.com/grails/grails-core/commit/27ceeb086baeb879c490f29f6d799cbd532c0772

综上所述,目前的解决方案是在每个测试方法中添加FreshRuntime注解。在 Grails 2.4.4 中修复GRAILS-11626后,您就可以在类级别使用该注释。