Не могу пройти замыкания в заводной - PullRequest
4 голосов
/ 15 марта 2012

Я пытаюсь запустить базовый пример для библиотеки Geb (http://www.gebish.org/manual/current/intro.html#introduction). Вот код:

import geb.Browser

Browser.drive {
   go "http://google.com/ncr"

    // make sure we actually got to the page
    assert title == "Google"

    // enter wikipedia into the search field
    $("input", name: "q").value("wikipedia")

    // wait for the change to results page to happen
    // (google updates the page dynamically without a new request)
    waitFor { title.endsWith("Google Search") }

    // is the first link to wikipedia?
    def firstLink = $("li.g", 0).find("a.l")
    assert firstLink.text() == "Wikipedia"

    // click the link 
    firstLink.click()

    // wait for Google's javascript to redirect to Wikipedia
    waitFor { title == "Wikipedia" }
}

Когда я пытаюсь запустить это (используя поддержку Eclipse), я получаю следующее исключение:

Caught: groovy.lang.MissingMethodException: No signature of method: static geb.Browser.drive() is applicable for argument types: (ExampleScript$_run_closure1) values: [ExampleScript$_run_closure1@2a62610b]
Possible solutions: drive(groovy.lang.Closure), drive(geb.Browser, groovy.lang.Closure), drive(geb.Configuration, groovy.lang.Closure), drive(java.util.Map, groovy.lang.Closure), print(java.lang.Object), print(java.io.PrintWriter)
groovy.lang.MissingMethodException: No signature of method: static geb.Browser.drive() is applicable for argument types: (ExampleScript$_run_closure1) values: [ExampleScript$_run_closure1@2a62610b]
Possible solutions: drive(groovy.lang.Closure), drive(geb.Browser, groovy.lang.Closure), drive(geb.Configuration, groovy.lang.Closure), drive(java.util.Map, groovy.lang.Closure), print(java.lang.Object), print(java.io.PrintWriter)
at ExampleScript.run(ExampleScript.groovy:21)

Я думаю, это говорит о том, что замыкание, которое я передаю статическому методу Browser.drive, не совместимо по типу с groovy.lang.Closure, но я не знаю почему. Простые скрипты приветного мира привет отлично работают, но передача замыкания в метод всегда возвращает похожую ошибку.

1 Ответ

2 голосов
/ 04 мая 2012

Плагиат от: http://groovy.codehaus.org/Differences+from+Java

Java-программисты используют точки с запятой, заканчивающие операторы и не имеющие замыканий. Также есть инициализаторы экземпляров в определениях классов. Так что вы можете увидеть что-то вроде:

class Trial {
  private final Thing thing = new Thing ( ) ;
  { thing.doSomething ( ) ; }
}

Многие Groovy-программисты отказываются от использования точек с запятой как отвлекающих и избыточных (хотя другие используют их постоянно - это вопрос стиля кодирования). Ситуация, которая приводит к трудностям, записывает вышеперечисленное в Groovy как:

class Trial {
  private final thing = new Thing ( )
  { thing.doSomething ( ) }
}

Это вызовет исключение MissingMethodException!

...