测试空的常规闭包?
Posted
技术标签:
【中文标题】测试空的常规闭包?【英文标题】:testing for empty groovy closure? 【发布时间】:2010-12-30 23:26:56 【问题描述】:我想让用户提供一个带有属性的 groovy 类,该属性是一个文件选择器闭包,我将它传递给 AntBuilder 的“复制”任务:
class Foo
def ANT = fileset(dir:'/tmp/tmp1')
在我的代码中,我将 ANT 属性设为“fAnt”并传递给 Ant:
ant.copy(todir:'/tmp/tmp2', fAnt)
这可行 - 但是,如果用户传入一个空的闭包 (def ANT=) 或使用一个不选择任何内容的选择器(可能文件集目录不存在),那么它就会爆炸。我尝试用 try-catch 包围 ant 副本以捕获 InvokerInvocationException,但不知何故,异常还是通过了……当我追踪它时,有没有办法将 groovy Closure 的内容作为字符串读回,或者测试它是否为空?
【问题讨论】:
【参考方案1】:简而言之:不。您不能在运行时以有意义的方式反编译闭包。如果它是用户提供的,那么闭包甚至可以是一个 Java 类。
长答案:如果你想做很多工作,你也许可以,但可能不值得。 Groovy 解析器是 API 的一部分,因此如果您可以访问源代码,理论上您可以检查 AST 并确定闭包是否为空。查看SourceUnit 类。
尽管如此,几乎可以肯定这不值得。您最好捕获异常并添加有用的消息,例如“您可能传递了一个空的闭包或无效的文件集”。
【讨论】:
【参考方案2】:解决了一个谜团 - 我需要捕获的异常是 org.apache.tools.ant.BuildException - 所以我可以捕获它以捕获错误,但最初的问题仍然存在 - 有没有办法检查闭包的内容?
【讨论】:
以上是关于测试空的常规闭包?的主要内容,如果未能解决你的问题,请参考以下文章