2

当我尝试清理班级时遇到问题。

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

}
4

1 回答 1

2

我遇到了类似的问题(Grails 2.2.0),我能够通过以下操作来克服它:

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

  2. 在测试类中使用FileObject.metaClass = nulltearDown()

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

注意:- 在我的例子中,与 Java 对象相比,我对 Groovy 对象进行了元分类。

于 2013-04-11T15:40:27.603 回答