【问题标题】:UnitTest (groovy + grails) - Cannot teardown metaclassUnitTest (groovy + grails) - 无法拆卸元类
【发布时间】:2013-04-02 21:54:46
【问题描述】:

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

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

}

【问题讨论】:

  • 你能展示一下 fileExists() 方法吗?您使用的是 Grails 2.x 吗?
  • 您是否尝试过在您的拆卸方法中将 FileObject 的元类设置为空,而不是通过元类注册表?将其设置为 null 应将其重置为其默认行为,然后每个测试都应正确覆盖它。
  • 我刚试过,但它不起作用。

标签: java unit-testing grails groovy metaclass


【解决方案1】:

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

  1. 在测试方法末尾使用GroovySystem.metaClassRegistry.removeMetaClass(FileObject.class)进行拆解

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多