java unit-testing maven groovy spock

java - Ejecución de pruebas unitarias spock con Maven



unit-testing groovy (3)

En un proyecto anterior, utilicé el marco de prueba de Spock para probar de forma unitaria mi código Java. Encontré esto realmente productivo, así que estoy tratando de agregar pruebas de Spock a mi proyecto actual que usa Maven como su herramienta de compilación (el proyecto anterior usó Gradle). Aunque puedo hacer que Maven compile mis pruebas de Spock (usando groovy-eclipse-compiler ), no puedo hacer que Maven realice las pruebas.

He hecho un ejemplo simple para demostrar mi problema con 2 archivos:

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

Contenido de 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>

Contenido de ASpec.groovy :

import spock.lang.Specification class ASpec extends Specification { def "Test A"(){ // Always fail expect: false } }

Cuando ejecuto mvn clean test (o mvn clean install ) esperaría que mi única prueba de unidad se ejecutara y fallara. Mientras está compilado, Maven no lo ejecuta. ¿Alguien sabe cómo realizar una prueba de unidad de Spock de Maven (o si es posible?)

(No he puesto mi prueba en un paquete para mantener el ejemplo simple. También he puesto mi código maravilloso en src / test / java para evitar configurar el ejemplo para recoger archivos de origen de un directorio adicional, de nuevo para mantener el ejemplo como lo mas simple posible)


Esta respuesta es puramente complementaria de la respuesta de @ PeterNiederwieser. En él menciona que puedes configurar el patrón de nombre usado por Surefire. Aquí hay un ejemplo de lo que funcionó para mí:

<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>

Source

Como mencioné en los comentarios, no estoy seguro de por qué **/*Spec.groovy no funcionó, pero estoy feliz de poder usar la convención normal de Spock aquí.


Maven Surefire encuentra clases de prueba por su nombre. Cambie el nombre de la clase a ATest , o reconfigure el patrón de nombre utilizado por Surefire. El POM para el proyecto spock-example demuestra cómo hacer esto último.


Tenía el mismo requisito para agregar Spock a mi aplicación web java existente. Intenté a Peters pero no funcionó para mí. gmavenplus-plugin de alguna manera (no tengo idea) reemplazó mi dependencia de guayaba con un Google lib muy antiguo y mi aplicación Spring rompió quejándose de un método inexistente.

Después de literalmente 2 o 3 docenas de intentos, finalmente pude integrar mis pruebas de la Unidad Spock y las pruebas de Integración y, lo que es más importante, aislar la compilación de las clases de Spock groovy de mi aplicación Java / Junit Spring / Hibernate existente.

Por supuesto, si hubiera gradle, habría resuelto el problema ... pero este es un proyecto heredado y, por lo tanto, no tuve la opción.

A continuación se muestran los complementos que he añadido. Tenga en cuenta que las pruebas unitarias de Spock terminan con Spec. Las pruebas de integración de Spock terminan con TI (pero lo más probable es que sea SpecIT). Puse mis pruebas de Spock bajo 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>

Y aquí están mis dependencias:

<!--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>

Y solo para hacerle saber, mi POM original no tenía absolutamente ningún complemento explícito. Así que tuve un POM muy simple para mi proyecto. Por lo tanto, debería funcionar para usted. Es un proyecto Java 1.7.

... y finalmente, solo para darte un poco de confianza de que esto no es una publicación basura, hice varias pruebas para garantizar que funcionara lo anterior:

  1. Solo construye el WAR sin las pruebas y despliega y prueba el humo localmente
    mvn limpiar instalar -DskipTests -Dmaven.test.skip = true

  2. Haga una compilación de prueba y vea si las pruebas de la Unidad Groovy también se compilan
    mvn -X limpia prueba-compila

  3. Realice una instalación limpia sin la prueba de integración (me aseguré de que estuviera fallando en esta prueba) y vea si se ejecutan las pruebas de la unidad Groovy
    mvn limpiar instalar -DskipITs

  4. Solo ejecuta la prueba de integración
    mvn failafe: integración-prueba

Me hubiera gustado incluir capturas de pantalla de lo anterior como prueba, pero habría que censurarlo ... Espero sinceramente que esto te ayude, ya que me estaba volviendo loco tratando de que esto funcionara ... Maven es un tema enorme zona. Buena suerte: =)