java - UnitTest (groovy + grails) - 无法拆卸元类

标签 java unit-testing grails groovy metaclass

我在尝试清理类(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),并且我能够通过以下方法克服它:

  1. 在测试方法末尾使用GroovySystem.metaClassRegistry.removeMetaClass(FileObject.class)来拆除

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

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

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

关于java - UnitTest (groovy + grails) - 无法拆卸元类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936329/

相关文章:

java - 绑定(bind) map 时调用自定义构造函数

java - java中如何从二维数组中删除元素

Rails 3.1 和 Assets 管道的 Javascript 单元测试

grails - grails嵌套事务Bean重置

grails - Google API:阅读文档

grails - 事务中的Grails Pogo方法调用

java - 如何从 Java 中确定安装了哪个 .NET 框架

Java JNI 在某些具有特定签名的 C 函数上崩溃

javascript - Jest |测试 moment 函数是否被调用以及返回输出是否正确

javascript - AngularJS : testing a factory that returns a promise, 在模拟使用 $http 的服务时