2012-01-16 39 views
4

我可以在Groovy与线条添加一个方法到Java整数类型:正确的方式来元程序在单元测试中

ExpandoMetaClass.EnableGlobally() 
Integer.metaClass.gimmeAP = {->return 'p'} 

我不知道为什么我需要的是,但它得到了重点。现在我可以拨打Integers并返回'p'。现在让我们说我想在Grails应用程序中这样做,以便我可以在域对象中进行调用。我有具体的问题是,当我把引导的元编程线所有的元编程是不是在单元测试可用的,所以我的单元测试中包含“没有方法gimmeAP为java.lang.Integer中的”错误失败或类似的东西。

我如何既包括元编程更好,或者执行引导,所以我可以用我欺骗了语法单元测试的一部分?

我已经看到这个问题:Grails - Making Methods Globally Available and Metaclass Programming,似乎我的线ExpandoMetaClass.EnableGlobally()可能会解决他的问题,但我使用它的权利?

回答

2

引导并不单元测试执行。我个人更喜欢创建一个执行上述元编程的mockFoo方法,然后我会从测试设置中调用mockFoo。 也看一下GrailsUnitTestCase.registerMetaClass。在添加模拟方法之前注册元类,以便在其他测试中不泄漏。

registerMetaClass(SecurityUtils) 
    SecurityUtils.metaClass.'static'.getSubject = { -> 
     return [logout: { return true } ] as Subject 
    } 

我知道你想使你的动态方法适用于所有的单元测试,但没有什么诸如引导单元测试。所以你必须在每个测试中做到这一点。

您可以创建一个静态方法MockHelper,并从测试设置调用它。

相关问题