我在尝试清理类(class)时遇到问题。
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
}
最佳答案
我遇到了类似的问题(Grails 2.2.0),并且我能够通过以下方法克服它:
在测试方法末尾使用
GroovySystem.metaClassRegistry.removeMetaClass(FileObject.class)
来拆除在测试类tearDown()中使用
FileObject.metaClass = null
我仍然想知道为什么我们需要同时使用两个tearDown。
注意:- 在我的例子中,我对 Groovy 对象与 Java 对象进行了元分类。
关于java - UnitTest (groovy + grails) - 无法拆卸元类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936329/