Ответ 1
Maven Surefire находит классы тестов по их имени. Либо измените имя класса на ATest
, либо измените шаблон имени, используемый Surefire. POM для проекта spock-example демонстрирует, как это сделать.
В предыдущем проекте я использовал среду тестирования Spock для unit test моего кода 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
), я ожидаю, что мой единственный unit test будет запущен и завершится сбой. Пока он скомпилирован, Maven не запускает его. Кто-нибудь знает, как запустить Spock unit test из Maven (или если это возможно?)
(Я не поставил свой тест в пакете, чтобы этот пример был простым. Также я поместил свой код groovy в src/test/java, чтобы избежать настройки примера для получения исходных файлов из дополнительного каталога, снова чтобы привести пример как можно более простым.)
Maven Surefire находит классы тестов по их имени. Либо измените имя класса на ATest
, либо измените шаблон имени, используемый Surefire. POM для проекта spock-example демонстрирует, как это сделать.
Этот ответ является чисто дополнительным ответом @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
не работал, но я рад возможности использовать здесь нормальный договор Спока.
У меня было такое же требование, чтобы добавить Spock в мое существующее Java-приложение. Я попробовал Питерса, но это не сработало для меня. gmavenplus-plugin каким-то образом (без понятия) заменил мою зависимость от guava с очень старой библиотекой google, и мое приложение Spring нарушило жалобы на несуществующий метод.
После буквально, возможно, 2 или 3 дюжины попыток, я наконец смог интегрировать тесты Spock Unit и тесты интеграции и, что более важно, изолировать компиляцию классов Spock groovy из моего существующего Java/Junit Spring/Hibernate.
Конечно, если бы у меня было gradle, это решило бы проблему... но это унаследованный проект, и поэтому у меня не было выбора.
Ниже приведены добавленные плагины. Обращаем ваше внимание на то, что тесты устройства Spock заканчиваются спецификацией. Тесты интеграции Spock заканчиваются IT (но скорее всего это должен быть 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.
... и, наконец, просто для того, чтобы дать вам определенную уверенность в том, что это не мусорный пост, я сделал несколько тестов, чтобы обеспечить выполнение вышеописанного:
Просто создайте WAR без тестов и развертывайте, а smoke test - локально
mvn clean install -DskipTests -Dmaven.test.skip = true
Скомпилируйте тест и посмотрите, скомпилированы ли модульные тесты groovy mvn -X clean test-compile
Выполняйте чистую установку без теста интеграции (я убедился, что он не работает для этого теста) и посмотрите, выполняются ли модульные тесты groovy mvn clean install -DskipITs
Просто запустите интеграционный тест
mvn отказоустойчивость: интеграция-тест
Мне хотелось бы включить скриншоты из вышеперечисленного в качестве доказательства, но это было бы подвергнуто цензуре... Итак, я искренне надеюсь, что это поможет вам, поскольку я шел с ума, пытаясь заставить это работать... Maven огромная предметная область. Удачи: =)