2012-01-16 37 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,並從測試設置調用它。

相關問題