Статьи

Spock 1.0 с Groovy 2.4 Сравнение конфигурации в Maven и Gradle

Спок 1.0 был наконец выпущен . О новых возможностях и улучшениях я уже написал два поста в блоге . Одним из последних изменений было разделение на артефакты, разработанные для определенных версий Groovy: 2.0, 2.2, 2.3 и 2.4, чтобы минимизировать шанс встретить двоичную несовместимость во время выполнения (в прошлом были только версии для Groovy 1.8 и 2.0+) , Это было сделано внезапно, и, основываясь на сообщениях в списке рассылки, это смутило некоторых людей. После того, как меня дважды попросили помочь правильно настроить два проекта, я решил написать небольшую статью, в которой рассказывалось, как настроить Spock 1.0 с Groovy 2.4 в Maven и Gradle. Это также отличное место для сравнения того, сколько работы требуется для выполнения этих двух очень популярных систем сборки.

специалист

Maven изначально не поддерживает другие языки JVM (например, Groovy или Scala). Чтобы использовать его в проекте Maven, необходимо использовать сторонний плагин. Для Groovy лучшим вариантом кажется GMavenPlus (переписанный плагин GMaven, который больше не поддерживается). Альтернативой является плагин, который позволяет использовать компилятор Groovy-Eclipse с Maven, но он не использует официальную версию, groovycи в прошлом были проблемы с обновлением новых выпусков / функций Groovy.

Пример конфигурации плагина GMavenPlus может выглядеть следующим образом:

<plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Поскольку мы хотим написать тесты в Spock, который рекомендует дополнительно называть файлы Specсуффиксами (из спецификации), необходимо указать Surefire искать тесты также в этих файлах:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${surefire.version}</version>
    <configuration>
        <includes>
            <include>**/*Spec.java</include> <!-- Yes, .java extension -->
            <include>**/*Test.java</include> <!-- Just in case of having also "normal" JUnit tests -->
        </includes>
    </configuration>
</plugin>

Пожалуйста, обратите внимание, что это необходимо включить, чтобы **/*Spec.javaне **/*Spec.groovyзаставить его работать.

Также необходимо добавить зависимости:

<dependencies>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-core</artifactId>
        <version>1.0-groovy-2.4</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Очень важно взять правильную версию Спока. Для Groovy 2.4 требуется версия 1.0-groovy-2.4. Для Groovy 2.3 версия 1.0-groovy-2.3. В случае ошибки Спок протестует с явным сообщением об ошибке:

Could not instantiate global transform class
org.spockframework.compiler.SpockTransform specified at
jar:file:/home/foo/.../spock-core-1.0-groovy-2.3.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation
because of exception
org.spockframework.util.IncompatibleGroovyVersionException:
The Spock compiler plugin cannot execute because Spock 1.0.0-groovy-2.3 is
not compatible with Groovy 2.4.0. For more information, see
http://versioninfo.spockframework.org

Вместе с другими обязательными элементами pom.xml размер файла увеличился до более чем 50 строк XML. Довольно много только для Groovy и Спока. Посмотрим, насколько это сложно в Gradle.

Gradle

Gradle имеет встроенную поддержку Groovy и Scala . Без дальнейших церемоний плагин Groovy просто должен быть применен.

apply plugin: 'groovy'

Далее необходимо добавить зависимости:

compile 'org.codehaus.groovy:groovy-all:2.4.1'
testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'

и информация, где Gradle должен искать их:

repositories {
    mavenCentral()
}

Вместе с определением группы пакетов и версии потребовалось 15 строк кода в основанном на Groovy DSL.

Кстати, в случае с Gradle также очень важно сопоставить версии Spock и Groovy, например Groovy 2.4.1 и Spock 1.0-groovy-2.4.

Резюме

Благодаря встроенной поддержке Groovy и компактному DSL Gradle является предпочтительным решением для начала игры со Споком (и Groovy в целом). Тем не менее, если вы предпочитаете Apache Maven с помощью GMavenPlus (и XML), также возможно создать проект, протестированный с помощью Spock.

Минимальный рабочий проект со Spock 1.0 и Groovy 2.4, настроенным в Maven и Gradle, можно клонировать с моего GitHub .

Графическое сравнение конфигурации Спока и Groovy в Maven и Gradle

Примечание 1 . Я не использовал Maven в своем проекте более 2 лет (я предпочитаю Gradle), поэтому, если есть лучший / более простой способ настройки Groovy и Spock с Maven, просто дайте мне знать в комментариях.

Примечание 2 . В примерах конфигурации предполагается, что Groovy используется только для тестов, а рабочий код написан на Java. Можно смешивать Groovy и Java-код вместе, но тогда конфигурация немного сложнее.