当我尝试清理课程时,我遇到了问题。
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
}
答案 0 :(得分:2)
我遇到了类似的问题(Grails 2.2.0),我可以通过以下方式克服它:
在测试方法结束时使用GroovySystem.metaClassRegistry.removeMetaClass(FileObject.class)
拆除
在测试类tearDown()
FileObject.metaClass = null
醇>
我仍然想知道为什么我们需要同时使用tearDown。
注意: - 在我的情况下,我将一个Groovy对象与Java对象进行了metaClassed。