Groovy中静态初始化块的用途是什么。为什么Geb使用它?如果它的使用与Java中的相同,那么如何在这样的情境中初始化非声明的字段呢?
class ManualsMenuModule extends Module {
static content = {
toggle { $("div.menu a.manuals") }
linksContainer { $("#manuals-menu") }
links { linksContainer.find("a") }
}
void open() {
toggle.click()
waitFor { !linksContainer.hasClass("animating") }
}
}
答案 0 :(得分:1)
Geb手册的section about the content DSL中提供了一些问题的答案。
使用Groovy's methodMissing()
mechanism实现DSL并修改分配给静态content
字段的闭包的delegate。如果您有兴趣深入挖掘,那么您可以随时查看PageContentTemplateBuilder
中的实现。
答案 1 :(得分:0)
我不是Geb的专家,我只能解释代码的groovy含义。
第一关,它不是像java中那样的静态初始化块。在那些行static content = {...}
中,您为一个静态变量分配了一个Closure实例,该实例被评估并执行了LATER(因此,lazy
)。
闭包代表Geb的Groovy构建器(的一部分),由Geb框架调用以注册/执行某些任务。
没有Java对应物可以实现相同的目标,这就是为什么基于groovy的框架非常适合用于测试目的的原因,并且它们遵循一般的经验法则:
测试代码应该比测试中的代码更抽象
更新:
这一行:
toggle { $("div.menu a.manuals") }
可以像
一样重写toggle( { $("div.menu a.manuals") } )
或
def a = { $("div.menu a.manuals") }
toggle a
所以这是一个方法调用,而不是一个赋值。在groovy中,您可以在某些情况下省略括号。