web-dev-qa-db-fra.com

Eclipse/Maven: les tests JUnit non compilés lors de leur exécution

Je travaille sur un projet utilisant Maven et Eclipse (plug-in m2Eclipse). J'ai des problèmes avec les tests JUnit: 

Parfois, lors de leur exécution dans Eclipse, ils ne sont pas compilés, mais les anciens fichiers de classe sont utilisés à la place. Lorsque je supprime les fichiers de classe, je reçois ClassNotFoundExceptions dans Eclipse. Je dois ensuite les recompiler manuellement en utilisant mvn test-compile ou d'autres objectifs. 

J'ai également remarqué que les fichiers de classe des tests sont parfois placés dans le sous-répertoire classes au lieu de test-classes.

Je ne peux vraiment pas comprendre ce qui ne va pas.

Les fichiers Java JUnit sont dans src/main/Java et portent le nom correct (*Test.Java). 

Dois-je les compiler et les exécuter toujours via Maven? Pourquoi Eclipse ne compile-t-il pas les fichiers lorsque je souhaite les exécuter? (Fait intéressant, parfois c'est le cas. Parfois tout fonctionne parfaitement.)

67
Tom

J'ai eu le même problème avec STS Eclipse (variante de développement Spring), m2e et JUnit. La solution consistait à définir le dossier de sortie pour src/test/Java sur target/test-classes:

  1. Cliquez avec le bouton droit sur le dossier src/test/Java dans l'Explorateur de packages.
  2. Sélectionnez chemin de compilation -> configurer le dossier de sortie.
  3. Entrez target/test-classes, cliquez OK

Maintenant, les modifications dans les classes de test sont correctement compilées et vous devriez pouvoir exécuter des tests JUnit dans Eclipse.

Le problème est qu'Eclipse compile les tests unitaires dans le dossier de sortie par défaut target/classes tandis que le plug-in JUnit tente correctement de les exécuter à partir de test-classes.

Il y a quelques doublons à cette question:

84
apa64

En plus de la réponse ci-dessous

  1. Clic droit sur le dossier src/test/Java
  2. Sélectionnez le chemin de construction -> Configurer le dossier de sortie
  3. Entrez target/test-classes, cliquez sur OK

vous devez vérifier que votre générateur est configuré correctement en cliquant avec le bouton droit de la souris sur votre projet et en accédant à Propriétés -> Générateur . Si vous voyez que votre constructeur est manquant, vous devez en installer un. Dans mon cas, le projet maven avait une dépendance AspectJ et lorsque j'ai utilisé le plug-in Maven Eclipse pour construire mon projet Eclipse, il recherchait un générateur AspectJ par défaut. J'ai installé les outils de développement AspectJ et cela a résolu le problème.

J'espère que cela t'aides!

5
Roosh

Et un autre point: les classes de test JUnit doivent être dans src/test/Java, pas src/main/Java, sinon elles ne sont pas correctement détectées par Maven en tant que classes de test et elles seraient incluses dans le fichier jar empaqueté et non dans le fichier jar de test. .

2
dunni

Le problème auquel vous faites face est probablement dû au fait que le dossier de sortie de src/test/Java n'est pas configuré correctement.

Au lieu de corriger cette configuration manuellement , vous pouvez demander à m2Eclipse de résoudre ce problème pour vous: faites un clic droit sur le projet et choisissez Maven> Mettre à jour le projet.

2
oberlies

J'ai fait face au même problème. Essayé ci-dessus des suggestions de configuration du dossier de sortie & Maven> Mettre à jour le projet, mais ne fonctionnaient pas. Enfin, mon testOutputDirectory a été remplacé par "build/classes" et les tests unitaires sont désormais repris et exécutés.

Enfin trouvé la raison du problème. Dans mon pom, nous avions également configuré le plugin maven compiler comme ci-dessous

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <outputDirectory>build/classes</outputDirectory>
            </configuration>
       </plugin>

la configuration de outputDirectory n'est pas nécessaire et a été à l'origine du problème ci-dessus. Après avoir supprimé cette balise, les junits sont compilés dans le dossier build> testclasses et sont également exécutés pendant la construction de maven. Yippee :) 

1
Pushkin

Assurez-vous qu'il y a un point d'exclamation sur l'icône de votre projet! Dans mon cas, j’ignore qu’il existe un point d’exclamation du type: point d’exclamation dans l’icône du projet

Ouvrez la perspective "Marqueurs", puis résolvez les problèmes conformément aux astuces . ce que montre la perspective "Marqueurs"

Les classes de test junit peuvent être exécutées avec succès après avoir appelé "mvn clean test" car elles ne font pas référence au fichier jar illisible qui doit être averti dans la perspective "Markers".

1
ElliotMok

C'est une chose à noter pour quelqu'un qui travaille sur le projet de mélange Java-scala . Même après avoir effectué la configuration de la manière indiquée ci-dessous,

<build>
    <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
    <plugins>
    ...
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
                <testSourceDir>${basedir}/src/test/scala</testSourceDir>
                <testOutputDir>${basedir}/target/test-classes</testOutputDir>
            </configuration>
         </plugin>
    </plugins>
</build>

et en faisant Maven> Update Project, Eclipse respecte le répertoire de sortie du dossier src/test/Java du projet, mais pas pour le dossier src/test/scala. (Vous pouvez le comprendre en cliquant avec le bouton droit de la souris sur le dossier source spécifique et en choisissant Chemin de construction> Configurer le dossier de sortie ..., qui devrait afficher l'emplacement spécifié dans le pom pour le cas précédent, mais pas pour le cas précédent. cas ultérieur.

C'est déjà un bogue connu pour l'utilisation de scala avec m2e, comme mentionné ici: http://scala-ide.org/docs/tutorials/m2Eclipse/

Attention

Depuis mars 2013, un bogue oblige src/main/scala et src/test/scala à utiliser le dossier de sortie par défaut (cible/classes). Cela peut prêter à confusion lors de la construction des tests, car leurs fichiers de classe ne se termineront pas par target/test-classes, comme ils le feraient lors de la construction sur la ligne de commande. Vous pouvez contourner ce problème en modifiant manuellement le dossier de sortie pour src/test/scala.

1
Gulats

Veuillez vérifier le chemin "testSourceDirectory" qui peut être configuré dans votre fichier pom.xml. Ajoutez ensuite le dossier (configuré dans le chemin "testSourceDirectory") au chemin de construction Eclipse.

Veuillez trouver l'exemple "testSourceDirectory" dans pom.xml ci-dessous:

<build>
    <testSourceDirectory>src/test/Java</testSourceDirectory>
    <plugins>
     <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>      
    </plugins>
  </build>
1
developer

Eclipse ne s’attend à rien d’autre avec les fichiers de classe. Cela suppose que si vous n'avez pas édité le fichier dans Eclipse, il n'a pas changé et n'a pas besoin d'être compilé. Je pense que le problème provient de Eclipse et de Maven partageant un répertoire de sortie. J'ai souvent vu cela si mon build mvn échoue, il aura supprimé les fichiers de classe dans le cadre des fichiers propres mais non compilés. Je pense que la meilleure solution serait d’avoir des répertoires de construction distincts pour MVN et Eclipse, mais je ne me suis jamais penché sur la question. 

0
James Scriven

Mon problème n'était pas le plugin JUnit mais plutôt la configuration dans mon pom.xml.

Après avoir passé en revue toutes les réponses à cette question, la réponse de @ Gulats m'a laissé entendre que je devrais essayer de définir une variable testOutputDirectory dans la section plug-in de maven-compiler-plugin.

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <testOutputDir>${basedir}/target/test-classes</testOutputDir>
  </configuration>
</plugin>
0
Jim Kiley