2013-04-10 54 views
2

我在嘗試清理類時出現問題。UnitTest(groovy + grails) - 無法拆卸元類

void testFileExists() { 

    FileObject file = EasyMock.createMock(FileObject.class) 

    VfsFileSystemManager.metaClass.getFile = {String s, String a ->return file} 

    FileObject.metaClass.exists = {-> return true} 

    assertEquals true, siteManagerHelper.fileExists(STRING, STRING) 

} 

void testFileNotExists() { 

    FileObject file = EasyMock.createMock(FileObject.class) 

    VfsFileSystemManager.metaClass.getFile = {String s, String a ->return file} 

    FileObject.metaClass.exists = {-> return false} 

    assertEquals false, siteManagerHelper.fileExists(STRING, STRING) 

} 

當我在一次運行一個,他們的工作很好,但如果我在同時運行,存在()總是返回true(如果我改變了虛假的第一.metaclass,它返回false) 。所以我認爲它並沒有拆除元類。

類擴展GroovyTestCase的,我檢查了我要補充:

def remove = GroovySystem.metaClassRegistry.&removeMetaClass 
remove FileObject 

但它不工作。

請幫忙!

編輯:

我使用Grails 1.3.7和1.6.8常規

private boolean fileExists(String path, String file){ 

    if(path != null && path != ""){ 

    FileObject fileToCheck = fsManager.getFile(path, file) 

    boolean fileExists = fileToCheck.exists() 

    logger.debug "File exists? ${fileExists}" 

    return fileExists 
    } 

    logger.debug "The path is null or empty" 

    return false 

} 
+0

你能顯示fileExists()方法嗎?你在使用Grails 2.x嗎? – 2013-04-11 02:10:42

+0

您是否嘗試過在拆卸方法中將FileObject的元類設置爲null而不是通過元類註冊表?將其設置爲空應該將其重置爲其默認行爲,然後每個測試都應正確覆蓋它。 – 2013-04-11 12:58:14

+0

我剛剛嘗試過,但不起作用。 – 2013-04-11 13:39:15

回答

2

我遇到了類似的問題(Grails的2.2.0),我能夠通過以下超越它下面:

  1. 使用GroovySystem.metaClassRegistry.removeMetaClass(FileObject.class)在試驗方法中的端部推倒

  2. 使用FileObject.metaClass = null在測試類拆解()

我仍然不知道爲什麼,我們需要同時使用兩個拆卸。

注意: - 在我的例子中,metaClassed一個Groovy對象與Java Object相比。

+0

它沒有工作=(謝謝! – 2013-04-11 17:12:04