Customize 'at' with extra parameters for the closure?

回眸只為那壹抹淺笑 提交于 2019-12-08 02:32:31

问题


Is it possible to specify some optional parameter(s) to the 'at' closure on the page like this:

class ManagerDashboardClientsPage extends Page {
    static at = { year, geo ->
        if (year) {
            GebUtil.selectedYear == year
        }
        title.endsWith('Dashboard: Clients')
    }
}

so that I can write both

at ManagerDashboardClientsPage

and

at ManagerDashboardClientsPage(2013, 'North East')

Currently the first one breaks with

No signature of method: page.ManagerDashboardClientsPage$__clinit__closure1.doCall() is applicable for argument types: () values: []
Possible solutions: doCall(java.lang.Object, java.lang.Object), call(), call([Ljava.lang.Object;), call(java.lang.Object), call(java.lang.Object, java.lang.Object), equals(java.lang.Object)
groovy.lang.MissingMethodException: No signature of method: page.ManagerDashboardClientsPage$__clinit__closure1.doCall() is applicable for argument types: () values: []
Possible solutions: doCall(java.lang.Object, java.lang.Object), call(), call([Ljava.lang.Object;), call(java.lang.Object), call(java.lang.Object, java.lang.Object), equals(java.lang.Object)
    at geb.Page.verifyThisPageAtOnly(Page.groovy:165)
    at geb.Page.verifyAt(Page.groovy:133)
    at geb.Browser.doAt(Browser.groovy:358)
    at geb.Browser.at(Browser.groovy:289)
    at geb.spock.GebSpec.methodMissing(GebSpec.groovy:51)
    at spec.ManagerDashboardClientsSpec.login as CEO(ManagerDashboardClientsSpec.groovy:16)

回答1:


In Groovy you can set default values for optional closure parameters, like so:

static at = { year=null, geo=null ->
    ...
}

I think that'll clear ya up. :)

update

Ok, I know you don't need it anymore, but I made this for my own use when I was learning Groovy, and I thought someone might find it helpful:

  • { -> ... } a closure with exactly zero parameters. Groovy will blow up if you call it with params.
  • { ... } a closure with one optional parameter, named "it"
  • { foo -> ... } a closure with one parameter named "foo" (foo can be any type)
  • { foo, bar, baz -> ... } a closure with 3 parameters named "foo", "bar" and "baz"
  • { String foo -> ... } You can specify the type of the parameters if you like


来源:https://stackoverflow.com/questions/21740702/customize-at-with-extra-parameters-for-the-closure

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!