我可以使用以下行向Groovy中的
java Integer类型添加一个方法:
ExpandoMetaClass.EnableGlobally()
Integer.metaClass.gimmeAP = {->return 'p'}
我不知道为什么我需要那个,但它得到了重点.现在我可以调用Integers并返回’p’.现在让我说我想在grails应用程序中这样做,这样我就可以在域对象中进行调用.我遇到的具体问题是,当我将这些元编程线放在引导程序中时,所有元编程都不能在单元测试中使用,所以我的单元测试失败了,例如“没有方法gimmeAP for java.lang.Integer”或类似的东西.
我如何更好地包含元编程,或执行引导程序的那部分,以便我可以在单元测试中使用我的欺骗语法?
我已经看到了这个问题:Grails – Making Methods Globally Available and Metaclass Programming,看起来我的行ExpandoMetaClass.EnableGlobally()可能解决了他的问题,但我使用它了吗?
最佳答案 单元测试不执行Bootstrap.我个人更喜欢创建一个执行上述元编程的mockFoo方法,然后我将从测试设置中调用mockFoo.
另请参阅GrailsUnitTestCase.registerMetaClass.在添加模拟方法之前注册元类,以便它们在其他测试中不会泄漏.
registerMetaClass(SecurityUtils)
SecurityUtils.metaClass.'static'.getSubject = { ->
return [logout: { return true } ] as Subject
}
我知道你想让你的动态方法可用于所有单元测试,但没有像引导程序那样进行单元测试.所以你必须在每次测试中都这样做.
您可以使用静态方法创建MockHelper,并从test setUp调用它.