В предыдущем проекте я использовал среду тестирования Spock для модульного тестирования своего Java-кода. Мне это показалось действительно продуктивным, поэтому я пытаюсь добавить тесты Spock в свой текущий проект, который использует Maven в качестве инструмента сборки (в предыдущем проекте использовался Gradle). Хотя я могу заставить Maven скомпилировать мои тесты Spock (используя groovy-eclipse-compiler), я не могу заставить Maven запускать тесты.

Я сделал простой пример, демонстрирующий мою проблему с двумя файлами:

  • pom.xml
  • src/test/java/ASpec.groovy

Содержание pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>my.group</groupId>
    <artifactId>my-artifact</artifactId>
    <version>0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
            <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.0.8</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>0.7-groovy-2.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <compilerId>groovy-eclipse-compiler</compilerId>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-compiler</artifactId>
                        <version>2.8.0-01</version>
                    </dependency>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-batch</artifactId>
                        <version>2.1.8-01</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

Содержание ASpec.groovy:

import spock.lang.Specification

class ASpec extends Specification {

    def "Test A"(){
        // Always fail
        expect: false
    }
}

Когда я выполняю mvn clean test (или mvn clean install), я ожидаю, что мой единственный модульный тест будет запущен и завершится ошибкой. Пока он компилируется, Maven не запускает его. Кто-нибудь знает, как запустить модульный тест Spock из Maven (или если это возможно?)

(Я не помещал свой тест в пакет, чтобы упростить пример. Также я поместил свой отличный код в src / test / java, чтобы избежать настройки примера для получения исходных файлов из дополнительного каталога, опять же, чтобы сохранить пример как как можно проще.)

29
Neil Stevens 7 Авг 2014 в 19:09

4 ответа

Лучший ответ

Maven Surefire находит тестовые классы по их имени. Либо измените имя класса на ATest, либо перенастройте шаблон имени, используемый Surefire. POM для проекта spock-example демонстрирует, как это сделать.

24
Peter Niederwieser 7 Авг 2014 в 19:23
7
Почему **/*Spec.java работает, а **/*Spec.groovy - нет?
 – 
Vajda
22 Май 2016 в 19:16
2
Не ответ, но вы можете использовать **/*Spec.class
 – 
wieczorekm
20 Авг 2017 в 19:37

Этот ответ является чисто дополнительным к ответу @ PeterNiederwieser. В нем он упоминает, что вы можете настроить шаблон имени, используемый Surefire. Вот пример того, что у меня сработало:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18</version>
    <configuration>
        <includes>
            <!-- By default only files ending in 'Test' will be included, so also include support for Spock style naming convention -->
            <!-- Oddly enough for Groovy files, *Spec.groovy does not work, but *Spec.java does -->
            <include>**/*Test.java</include>
            <include>**/*Spec.java</include>
        </includes>
    </configuration>
</plugin>

Источник

Как я упоминал в комментариях, я не уверен, почему **/*Spec.groovy не работал, но я счастлив, что могу использовать здесь обычное соглашение Спока.

29
Captain Man 19 Авг 2015 в 23:34
1
Обратите внимание: если вы хотите включить все тесты, которые обычно находит JUnit, вам необходимо включить «**/Test*.java», «**/*Test.java» и «**/*TestCase.java» в соответствии с Документация по плагину Surefire.
 – 
M. Justin
16 Фев 2017 в 23:31
Сбор за комментарий об использовании **/*Spec.java, даже если расширения моих файлов спецификации .groovy
 – 
rilaby
5 Май 2017 в 02:11

У меня было такое же требование добавить Spock в мое существующее веб-приложение java. Я попробовал Петерса, но у меня ничего не вышло. gmavenplus-plugin каким-то образом (без понятия) заменил мою зависимость guava очень старой библиотекой Google, и мое приложение Spring сломалось, жалуясь на несуществующий метод.

Буквально после двух или трех десятков попыток я наконец смог интегрировать свои тесты Spock Unit и Integration тесты и, что более важно, изолировать компиляцию классов Spock groovy от моего существующего приложения Java / Junit Spring / Hibernate.

Конечно, если бы у меня был градиент, это решило бы проблему ... но это устаревший проект, и поэтому у меня не было выбора.

Ниже я добавил плагины. Обратите внимание, что модульные тесты Spock заканчиваются на Spec. Интеграционные тесты Spock заканчиваются ИТ (но, скорее всего, это должен быть SpecIT). Я поместил свои тесты Spock в src / test / groovy.

         <plugins>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <!-- Without joint compilation - no dependencies between Java and Groovy (inheritance)-->
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <sources>
                        <source>
                            <directory>${project.basedir}/src/main/java/groovy</directory>
                            <includes>
                                <include>**/*.groovy</include>
                            </includes>
                        </source>
                    </sources>
                    <testSources>
                        <testSource>
                            <directory>${project.basedir}/src/test/groovy</directory>
                            <includes>
                                <include>**/*.groovy</include>
                            </includes>
                        </testSource>
                    </testSources>

                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <testSourceDirectory>src/test/groovy</testSourceDirectory>
                    <testSourceDirectory>src/test/java</testSourceDirectory>
                    <includes>
                        <include>**/*Spec.java</include>
                        <!-- Yes, .java extension -->
                        <include>**/*Test.java</include>
                        <!-- Just in case having "normal" JUnit tests -->
                    </includes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <useFile>false</useFile>
                    <includes>
                        <include>**/*IT.java</include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

И вот мои зависимости:

        <!--Spock -->
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>2.4.7</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>1.1-groovy-2.4</version>
        </dependency>

        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-spring</artifactId>
            <version>1.1-groovy-2.4</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.groovy.modules.http-builder</groupId>
            <artifactId>http-builder</artifactId>
            <version>0.7.1</version>
        </dependency>
        <!--Spock mocking dependencies -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>3.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.objenesis</groupId>
            <artifactId>objenesis</artifactId>
            <version>2.6</version>
        </dependency>

И просто чтобы вы знали, мой оригинальный POM не имел абсолютно никаких явных плагинов ВООБЩЕ. Так что у меня был очень простой POM для моего проекта. Так что это должно работать на вас. Это проект Java 1.7.

... и, наконец, чтобы вы были уверены, что это не ерунда, я провел несколько тестов, чтобы убедиться, что вышеперечисленное сработало:

  1. Просто создайте WAR без тестов, разверните и испытайте его локально
    mvn clean install -DskipTests -Dmaven.test.skip = true

  2. Выполните тестовую компиляцию и посмотрите, будут ли скомпилированы и модульные тесты Groovy
    mvn -X clean test-compile

  3. Выполните чистую установку без теста интеграции (я убедился, что он не прошел для этого теста) и посмотрите, запущены ли модульные тесты Groovy
    mvn clean install -DskipITs

  4. Просто запустите интеграционный тест
    mvn failsafe: integration-test

Я хотел бы включить скриншоты вышеизложенного в качестве доказательства, но это пришлось бы подвергнуть цензуре ... Итак, я искренне надеюсь, что это поможет вам, поскольку я с ума сошел, пытаясь заставить это работать ... Maven - огромная тема область. Удачи: =)

3
Beezer 31 Авг 2017 в 18:06

Проблема, с которой я столкнулся, - несовместимые зависимости.

Зависимость spock-core, конечно же, влечет за собой зависимость от нужной ей версии groovy. Но возможно, что другие зависимости или плагины (я думаю, что плагин gmaven-plus в моем случае) потянут другую, несовместимую версию groovy.

Я исправил проблему, явно указав зависимость от пакета groovy, который я хотел использовать.

0
Raedwald 25 Июн 2021 в 18:37