Kotlin – Maven no está realizando testings

Entonces tengo una aplicación Kotlin que quiero probar. Mis files de testing ( .kt ) se ejecutan con éxito en Eclipse. (la testing en sí es una testing jdbc h2 mock ).

Ahora cuando se ejecuta mvn test -X dice:

  releases: [enabled => true, update => never] ] [DEBUG] (s) reportFormat = brief [DEBUG] (s) reportsDirectory = C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete\target\surefire-reports [DEBUG] (f) rerunFailingTestsCount = 0 [DEBUG] (f) reuseForks = true [DEBUG] (s) runOrder = filesystem [DEBUG] (f) shutdown = testset [DEBUG] (s) skip = false [DEBUG] (f) skipAfterFailureCount = 0 [DEBUG] (s) skipTests = false [DEBUG] (s) suiteXmlFiles = [] [DEBUG] (s) testClassesDirectory = C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete\target\test-classes [DEBUG] (s) testFailureIgnore = false [DEBUG] (s) testNGArtifactName = org.testng:testng [DEBUG] (s) testSourceDirectory = C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete\src\test\java [DEBUG] (s) threadCountClasses = 0 [DEBUG] (s) threadCountMethods = 0 [DEBUG] (s) threadCountSuites = 0 [DEBUG] (s) trimStackTrace = true [DEBUG] (s) useFile = true [DEBUG] (s) useManifestOnlyJar = true [DEBUG] (s) useSystemClassLoader = true [DEBUG] (s) useUnlimitedThreads = false [DEBUG] (s) workingDirectory = C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete [DEBUG] (s) project = MavenProject: org.springframework:gs-rest-service:0.1.0 @ C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete\pom.xml 

Y no ejecuta ninguna testing (No puede encontrar em)

Aquí está mi pom.xml

 <?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.springframework</groupId> <artifactId>gs-rest-service</artifactId> <version>0.1.0</version> <packaging>war</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <!-- <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <scope>test</scope> </dependency>--> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>1.0.3</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>9.4.1211</version><!--$NO-MVN-MAN-VER$ --> </dependency> <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.191</version> </dependency> <!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-reflect --> </dependencies> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <artifactId>kotlin-maven-plugin</artifactId> <groupId>org.jetbrains.kotlin</groupId> <version>1.0.3</version> <executions> <execution> <id>compile</id> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/main/java</sourceDir> </sourceDirs> </configuration> </execution> <execution> <id>test-compile</id> <goals> <goal>test-compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/main/java</sourceDir> </sourceDirs> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version><!--$NO-MVN-MAN-VER$ --> <executions> <!-- Replacing default-compile as it is treated specially by maven --> <execution> <id>default-compile</id> <phase>none</phase> </execution> <!-- Replacing default-testCompile as it is treated specially by maven --> <execution> <id>default-testCompile</id> <phase>none</phase> </execution> <execution> <id>java-compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>java-test-compile</id> <phase>test-compile</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version><!--$NO-MVN-MAN-VER$--> <configuration> <includes> <include>**/Test*.kt</include> <include>**/*Test.kt</include> <include>**/*TestCase.kt</include> </includes> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project> 

Dos problemas, el primer problema que encontraste pero documentaré aquí. En el complemento de Kotlin-Maven tiene la configuration para el objective de test-compile de test-compile como:

 <execution> <id>test-compile</id> <goals> <goal>test-compile</goal> </goals> <configuration> <sourceDirs> <sourceDir>${project.basedir}/src/main/java</sourceDir> </sourceDirs> </configuration> </execution> 

Que está comstackndo el directory src/main/java lugar de src/test/java para que tus testings no se compilen en absoluto. Debiera ser:

  <sourceDirs> <sourceDir>${project.basedir}/src/test/java</sourceDir> </sourceDirs> 

O si sus files están en los directorys java y kotlin :

  <sourceDirs> <sourceDir>${project.basedir}/src/test/java</sourceDir> <sourceDir>${project.basedir}/src/test/kotlin</sourceDir> </sourceDirs> 

El segundo problema es probable que intentes solucionar el primero. Y se ve bien en la superficie, pero es la configuration incorrecta del plugin Surefire. La documentation del plugin Maven Surefire no es muy precisa (o no está completa sobre cómo funciona). Si elimina por completo la configuration de su complemento Surefire, funcionará porque los valores pnetworkingeterminados ya hacen lo que usted desea. O puede cambiar de listr los patrones de files de include de tener el sufijo .kt lugar de los sufijos .class o .class y eso funcionará bien incluso para Kotlin, Clojure, Scala, …

¿Por qué? aquí está la historia …

Esta configuration:

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <includes> <include>**/Test*.java</include> <include>**/*Test.java</include> <include>**/*TestCase.java</include> <include>**/RandomName.java</include> </includes> </configuration> </plugin> 

No hace lo que crees que hace. Esto se convierte realmente en Surefire al hacer una búsqueda y replacelo en .java a .class , y se convierte internamente en:

  <configuration> <includes> <include>**/Test*.class</include> <include>**/*Test.class</include> <include>**/*TestCase.class</include> <include>**/RandomName.class</include> </includes> </configuration> 

Pero si usas la extensión .kt rompes esta magia codificada. Puedes verlo en el código fuente del complemento Surefire donde reemplaza los files que terminan con .java con .class . Ooops, no tiene nada que ver con los files fuente y está buscando classs comstackdas.

En el plugin Surefire 2.19 agregaron la capacidad de tener expresiones regulares y también patrones de nombre de class totalmente calificados . Así que la forma en que el complemento decide qué está usando parece ser la extensión de nombre de file .java . Si ve .java , sabe que cada file .java convierte en una class del mismo nombre, por lo que busca las classs que coinciden con el patrón, no el código fuente. La fuente ya está comstackda por los complementos del comstackdor, no por el corrector de testing. No tiene nada que search el código fuente.

Así que esta configuration es engañosa y realmente está usando "magia" para descubrir un nombre de class en lugar de simplemente pedir nombres de class. Por supuesto, las muestras y todo lo hacen creer por completo que está relacionado con los files fuente. No lo es

Es mejor no usar configuration y seguir la convención de nomenclatura pnetworkingeterminada. O bien, si debe especificar algo, use la versión más moderna de regex o nombre de class de la configuration de include :

  <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <includes> <include>Test*</include> <include>*Test</include> <include>*TestCase</include> <include>RandomName</include> </includes> </configuration> </plugin> 

Que ahora se compara con cualquier class con esos nombres en cualquier package.