Groovy中静态初始化块的用途是什么?

时间:2018-05-29 13:57:14

标签: groovy geb

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") }
    }
}

2 个答案:

答案 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中,您可以在某些情况下省略括号。