2013-02-27 62 views
1

我知道這個特定主題有很多,但是我無法找到任何人偶然發現我的問題,並希望有人可以向我解釋這一點。集成和單元測試之間的Grails污染

我有一個域名,我在equals方法使用注射grailsApplication的動態方法「isDomainClass」:

@Override 
public boolean equals(Object obj) { 
    if(!grailsApplication.isDomainClass(obj.getClass())) { return false } 
    ... 
} 

這工作得很好,並進行單元測試這個我做的:

@Mock([MyDomain]) 
... 
def mockGApp 
void setUp() { 
    mockGApp = new Object() 
    mockGApp.metaClass.isDomainClass = { obj -> true } 
} 
... 
void testSomething() { 
    def myDomain = new MyDomain() 
    myDomain.grailsApplication = mockGApp 
    .... 
} 

當我使用test-app -unit(在命令行或STS中)運行它時,它通過很好。

我然後AVE使用一個集成測試該域(無嘲笑此時間)和再次,如果我當與測試應用程式內 - 整合(在命令行或在STS)跑

然而運行正常運行'測試應用程序',所以它同時做到這一點,我得到一個MissingMethodException: no method signature isDomainClass exists with parameters (java.lang.Class) ...和所有的爵士樂。

在調查println的服務時,我正在測試中,在測試的集成部分中,在我的域類的equals方法被調用之前,我可以很高興地調用grailsApplication.isDomainClass()並獲取期望的影響。但是,當代碼步入域的等號函數時,儘管grailsApplication對象引用服務中引用的同一對象並具有動態添加的方法,但方法不再存在。

看來,grails添加到這個類的動態方法在域的方法中被調用但是被注入到服務中時沒有被注入。更奇怪的是,這隻有在集成測試遵循單元測試時纔會發生。如果單獨完成,沒有問題...

這種污染源於哪裏?有沒有辦法解決它?

P.S.使用Grails 2.1.0

+0

我已經找到了解決的辦法,通過使用.isArtefactOfType(「域」,......),而不是isDomainClass但是仍然會有人來闡明發生的一切更加光明和愛如何避免它 – DJOodle 2013-02-27 15:41:23

回答

0

您必須從destroy方法中的metaClassRegistry(即測試用例運行後)中刪除您從metaClassRegistry修改的類。請看下圖:

@After 
void destroy() { 
    GroovySystem.metaClassRegistry.removeMetaClass(MyDomain.class) 
}