Какая польза от статического блока инициализации в Groovy? - PullRequest
0 голосов

Как использовать блок статической инициализации в Groovy.Почему Геб использует это?Если его использование такое же, как в 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 голосов
/ 31 мая 2018

Некоторые ответы на ваши вопросы приведены в разделе о содержании DSL руководства Geb.

DSL реализован с использованием механизма Groovy methodMissing() и изменение делегата замыкания, назначенного статическому полю content.Если вы заинтересованы в копании глубже, вы всегда можете посмотреть на реализацию в PageContentTemplateBuilder.

0 голосов
/ 29 мая 2018

Я не эксперт в Geb, я могу объяснить только отличное значение кода.

1-й, это не статический блок инициализации, как в Java.В этих строках static content = {...} вы присваиваете статической переменной экземпляр Closure, который оценивается и выполняется LATER (следовательно, lazy).

Закрытие представляет собой (часть) Groovy Builder Geb, который вызывается средой Geb для регистрации / выполнения некоторых задач.

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

тестовый код должен быть более абстрактным, чем тестируемый код

ОБНОВЛЕНИЕ:

Эта строка:

toggle { $("div.menu a.manuals") }

может быть переписана как

toggle( { $("div.menu a.manuals") } )

или

def a = { $("div.menu a.manuals") }
toggle a

, так что это вызов метода ине назначение.В groovy вы можете опустить скобки в некоторых случаях.

...