J'ai une application Kotlin que je souhaite tester. Mes .kt
fichiers tests ( ) s'exécutent avec succès dans Eclipse. (Le test lui-même est un h2 mock
test jdbc).
Maintenant, lors de l'exécution, mvn test -X
il dit:
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
Et il n'exécute aucun test (il ne peut pas les trouver)
Voici mon 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>
Deux problèmes, le premier problème que vous avez rencontré vous-même mais je vais documenter ici. Dans le plugin Kotlin-Maven, vous avez les paramètres d' test-compile
objectif comme:
<execution>
<id>test-compile</id>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/main/java</sourceDir>
</sourceDirs>
</configuration>
</execution>
Ce qui compile le src/main/java
répertoire au lieu de src/test/java
sorte que vos tests ne soient pas du tout compilés. Devrait être:
<sourceDirs>
<sourceDir>${project.basedir}/src/test/java</sourceDir>
</sourceDirs>
Ou si vos fichiers se trouvent à la fois dans les répertoires java
et kotlin
:
<sourceDirs>
<sourceDir>${project.basedir}/src/test/java</sourceDir>
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
</sourceDirs>
Le deuxième problème est probablement que vous essayez de contourner le premier. Et ça a l'air bien en surface mais c'est une configuration incorrecte du plugin Surefire. La documentation du plugin Maven Surefire n'est pas tout à fait précise (ou n'est pas complète sur son fonctionnement). Si vous supprimez complètement la configuration de votre plugin Surefire, cela fonctionnera car les valeurs par défaut font déjà ce que vous voulez. Ou vous pouvez changer la liste des include
modèles de fichiers en ayant le .kt
suffixe à la place .class
ou des .java
suffixes et ceux-ci fonctionneront bien même pour Kotlin, Clojure, Scala, ...
Pourquoi? voici l'histoire ...
Cette 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>
Ne fait pas ce que tu penses qu'il fait. Ceci est en fait transformé en Surefire en faisant une recherche et remplacer le .java
à .class
, et devient en interne:
<configuration>
<includes>
<include>**/Test*.class</include>
<include>**/*Test.class</include>
<include>**/*TestCase.class</include>
<include>**/RandomName.class</include>
</includes>
</configuration>
Mais si vous utilisez l' .kt
extension, vous brisez cette magie codée en dur. Vous pouvez le voir dans le code source du plugin Surefire où il remplace les fichiers qui se terminent .java
par .class
. Oups, cela n'a rien à voir avec les fichiers sources et recherche des classes compilées.
Dans le plugin Surefire, 2.19
ils ont ajouté la possibilité d'avoir des expressions régulières et des modèles de nom de classe pleinement qualifiés . Donc, la façon dont le plugin décide que vous utilisez semble être par l'extension de nom de fichier .java
. S'il voit, .java
il sait que chaque .java
fichier devient une classe du même nom, il recherche donc à la place les classes qui correspondent au modèle, pas le code source. La source est déjà compilée par les plugins du compilateur, pas par le testeur. Il n'a aucune entreprise à rechercher du code source.
Donc, ce paramètre est trompeur et utilise vraiment la "magie" pour trouver un nom de classe au lieu de simplement demander des noms de classe. Bien sûr, les échantillons et tout vous font complètement croire qu'il est lié aux fichiers source. Ça ne l'est pas.
Il est préférable de n'utiliser aucune configuration et de suivre la convention de dénomination par défaut. Ou si vous devez spécifier quelque chose, utilisez la version plus moderne de l'expression régulière ou du nom de classe de la include
configuration:
<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>
Ce qui se compare maintenant à n'importe quelle classe avec ces noms dans n'importe quel package.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots