UnitTest(groovy + grails) - 不能拆卸元类

时间:2013-04-10 21:02:01

标签: java unit-testing grails groovy metaclass

当我尝试清理课程时,我遇到了问题。

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)

}

当我当时运行一个时,它们工作正常,但如果我同时运行两个,则exists()始终返回true(如果我将第一个.metaclass更改为false,则返回false)。所以我认为它并没有拆掉元类。

该类扩展了GroovyTestCase,我检查了我应该添加:

def remove = GroovySystem.metaClassRegistry.&removeMetaClass
remove FileObject

但它不起作用。

请帮忙!

编辑:

我正在使用grails 1.3.7和groovy 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

}

1 个答案:

答案 0 :(得分:2)

我遇到了类似的问题(Grails 2.2.0),我可以通过以下方式克服它:

  1. 在测试方法结束时使用GroovySystem.metaClassRegistry.removeMetaClass(FileObject.class)拆除

  2. 在测试类tearDown()

  3. 中使用FileObject.metaClass = null

    我仍然想知道为什么我们需要同时使用tearDown。

    注意: - 在我的情况下,我将一个Groovy对象与Java对象进行了metaClassed。