Exception de classe introuvable lors de l'exécution du test JUnit

117

J'obtiens cette erreur lors de l'exécution du test JUnit dans Eclipse:

Class not found com.myproject.server.MyTest
java.lang.ClassNotFoundException: com.myproject.server.MyTest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

J'ai essayé d'ajouter une JUnitbibliothèque dans le chemin de classe bien que j'utilise maven, et la bibliothèque JUnit est dans la dépendance POM.

J'ai déjà essayé de nettoyer le projet et créé un nouveau cas de test JUnit à l'aide du plugin JUnit pour Eclipse, en obtenant toujours la même erreur.

quarks
la source
10
essayez d'exécuter mvn clean testune fois qu'il compilera toutes les classes de test
Jigar Joshi
1
Pouvez-vous vérifier si com.myproject.server.MyTest est présent dans le dossier bin? Je veux dire que s'il n'est pas compilé en raison d'une erreur de chemin de compilation ou de construction, vous obtiendrez cette erreur.
vikas
testez-vous une classe ou l'ensemble du projet?
Doszi89
Reproduction possible d' Eclipse - java.lang.ClassNotFoundException
Amos M. Carpenter
1
Dans mon cas, exécuter des tests à l'aide de Maven a fonctionné, mais si je clique avec le bouton droit sur une classe de test et que je choisis Exécuter en tant que -> JUnit Test, cela signale ClassNotFoundException. Je l'ai corrigé en cliquant avec le bouton droit sur le projet et en allant dans Propriétés -> Constructeurs, puis en déplaçant Maven Project Builder au-dessus de Java Builder
xorcus

Réponses:

121

Cela semble se produire parce que seul le code source est en cours de compilation lorsque vous utilisez mvn clean compile(j'utilise maven 3.1.0 donc je ne suis pas sûr qu'il se comporte toujours comme ça).

Si vous exécutez mvn test, le code de test se compilera également, mais ensuite il exécute les tests (ce qui peut ne pas être immédiatement souhaitable si vous essayez de les exécuter via Eclipse.) La solution consiste à ajouter test-compileà votre séquence de commandes Maven à chaque fois vous faites un mvn clean. Par exemple, vous exécuteriez mvn clean compile test-compile.

Newtrino
la source
1
Cela s'est produit une fois et la réponse de slomek a fonctionné, puis cette même erreur s'est reproduite, j'ai donc dû essayer cela également. Cela fonctionne à nouveau correctement maintenant, donc pour être sûr, vous voudrez peut-être faire ces deux choses.
Roger le
Merci, ça a marché pour moi. Mais dans mon cas, cela n'a pas fonctionné jusqu'à la fermeture et a rouvert le projet en éclipse.
Paramesh Korrakuti
En termes simples, faites un «mvn clean test-compile», puis exécutez vos tests Junit dans eclipse. Cela a fonctionné pour moi. Merci.
Sreram
103

J'ai eu un problème similaire avec mes tests et j'ai trouvé quelque part sur le Web que vous devez accéder au chemin de construction dans les propriétés de votre projet et déplacer les dépendances Maven au-dessus de la bibliothèque système JRE . Cela semble avoir fonctionné pour moi.

Slomek
la source
1
Merci cela a résolu mon problème. Le test réel obtenait l'erreur de classe non trouvée lorsque j'ai essayé de l'exécuter. Je pense que c'est probablement une première étape préférable avant d'ajouter des cibles de build mvn supplémentaires.
Roger le
8
Cette méthode est décrite avec des captures d'écran dans cet article (au cas où les étapes ne seraient pas claires à partir de la réponse de @ slomek ci-dessus)
nhylated
2
Je ne pouvais pas déplacer les dépendances gérées par Maven au-dessus de la bibliothèque système JRE dans Eclipse Mars 2, mais je pouvais faire un clic droit sur le projet et aller dans Propriétés -> Constructeurs, puis déplacer Maven Project Builder au-dessus de Java Builder et cela a fonctionné pour moi.
xorcus
J'ai essayé tout ce qui précède et cela n'a pas fonctionné, je ne pouvais pas non plus déplacer les dépendances Maven à propos de la bibliothèque système JRE, mais c'était sous l'onglet Bibliothèques. Ensuite, je suis allé à Build Path -> Order & Export -> car j'ai pu déplacer les dépendances Maven au-dessus de la bibliothèque JRE System. Ensuite, j'ai construit le projet et exécuté une installation Maven, puis le test s'est déroulé avec succès.
Megan
22

J'ai rencontré le même problème et j'ai pu le résoudre en utilisant la réponse de @ slomek, mais le problème a refait surface après cela.

Je l'ai finalement corrigé en ajoutant le dossier de sortie de mon projet à la configuration d'exécution du test JUnit. Les étapes sont:

  • Recherchez le dossier de sortie de votre projet dans Project properties -> Java Build Path -> Default output folder
    • Habituellement, c'est <project-folder>/bin
  • Aller à Run -> Run Configurations...
  • Cliquez sur la configuration d'exécution du test unitaire et cliquez sur l' Classpathonglet
  • Ajoutez explicitement le dossier de sortie de votre projet sous User Entries- même si le projet y est déjà inclus
    • Cliquez sur Advanced -> Add folderpour ajouter le dossier de sortie

Ce problème peut être dû à une configuration de projet étrange dans Eclipse - par exemple, un dossier source avec des projets maven imbriqués importés en tant que projet / dossier unique (du moins, c'était ainsi que mon projet était configuré).

nhylé
la source
Merci beaucoup; J'ai eu ce problème. Votre solution a fonctionné pour moi; les deux premiers ne l'ont pas fait. Voté.
davtom
Absolument brillant! Je me gratte la tête depuis des lustres à ce sujet. Merci!
RayCh
17

Si ce problème se produit dans Eclipse uniquement, l'exécution de la commande Projet -> Nettoyer ... sur le projet sélectionné peut aider.

Johanwannheden
la source
Merci - cela a fonctionné pour moi - JAVE EE eclipse gradlew
Abdeali Chandanwala
11

Après avoir tout essayé ici sans amélioration, j'ai résolu mon problème en redémarrant simplement Eclipse

Berit Larsen
la source
5

J'ai résolu mon problème en exécutant la mise à jour maven. Cliquez avec le bouton droit sur projeter votre projet> Maven> Mettre à jour le projet

Azianese
la source
3

Dans mon cas, j'avais une mauvaise structure de répertoire maven.

Ce qui devrait être comme:

/ src / test / java / com.myproject.server.MyTest

Après avoir réglé cela - tout a fonctionné comme un charme.

ITisha
la source
2

Dans mon cas, seules les étapes suivantes m'ont aidé à résoudre ce problème:

  1. Projet-> propriétés-> Paramètres d'exécution / de débogage.
  2. Dans "Lancer les configurations pour '.....'", sélectionnez les classes / projets
  3. Edit -> Classpath -> "Restaurer les entrées par défaut"
Roman Romaniuk
la source
Merci!! Seul celui-ci m'a aidé !!
sumandas
1

Plus tôt, dans ce cas, j'ai toujours fait mvn eclipse:eclipse et redémarré mon Eclipse et cela a fonctionné. Après la migration vers GIT, cela a cessé de fonctionner pour moi, ce qui est un peu étrange.

Le problème de base ici est que M. Eclipse ne trouve pas la classe compilée. Ensuite, j'ai défini le dossier de sortie comme Project / target / test-classes qui est généré par défaut par mvn clean installsans sauter le test et j'ai procédé à la solution de contournement suivante:

Option 1: définir le chemin de classe pour chaque scénario de test

Eclipse -> Exécuter -> Exécuter les configurations -> sous JUnit-> sélectionner mon test -> sous l'onglet chemin de classe-> Sélectionner les entrées utilisateur-> Avancé-> Ajouter un dossier -> Sélectionner -> Appliquer-> Exécuter

Option 2: créer une variable classpath et l'inclure dans classpath pour tous les cas de test

Eclipse -> Windows -> Variables de chemin de classe -> Nouveau -> [Nom: Junit_test_cases_cp | chemin:] -> ok Ensuite, allez dans Eclipse-> Exécuter -> Exécuter les configurations -> JUnit-> sélectionnez mon test -> sous l'onglet chemin de classe -> Sélectionnez les entrées utilisateur-> Avancé-> Ajouter des variables de chemin de classe-> Sélectionnez Junit_test_cases_cp-> ok- > Appliquer-> Exécuter

C'est la seule chose qui fonctionne actuellement pour moi après avoir essayé toutes les suggestions en ligne.

user3222211
la source
1

J'ai eu le même problème avec un projet Gradle avec un SourceSet de test avec deux répertoires de ressources.

Cet extrait de code provient d'un main-module.gradle et ajoute un répertoire de ressources au SourceSet de test:

sourceSets {
    test {
        resources {
            srcDir('../other-module/src/test/resources')
        }
    }
}

Pour ce faire, j'avais deux répertoires de ressources liés au test SourceSet du module principal du projet:

../other-module/src/test/resources src / test / resources (relatif au dossier du module principal, automatiquement ajouté par le plugin java)

Je découvre que si j'avais deux fichiers avec le même nom dans les deux répertoires source, quelque chose dans l'étape des ressources de processus s'est mal passé. En conséquence, aucune compilation n'a commencé et pour cette raison aucun .class n'a été copié dans le répertoire bin, où JUnit recherchait les classes. L'exception ClassNotFoundException a disparu en renommant simplement l'un des deux fichiers.

David Obber
la source
1

NoClassDefFoundError signifie vraiment qu'il ne peut pas initialiser la classe. Cela n'a rien à voir avec la recherche de la classe. J'ai eu cette erreur lors de l'appel de trim () sur une chaîne nulle.

JUnit n'affichera pas NullPointerException. La chaîne n'est pas nulle lorsqu'elle est exécutée normalement car je récupère la chaîne à partir d'un fichier de propriétés qui n'est pas disponible pour les tests.

Mon conseil est de retirer des morceaux de la classe jusqu'à ce que vos tests commencent à réussir. Ensuite, vous pouvez déterminer quelle ligne donne l'erreur.

Philip Rego
la source
0

J'ai eu le même problème avec mon Eclipse Helios qui débogage Junits. Mon problème était un peu différent car j'ai pu exécuter Junits avec succès, mais lorsque j'obtenais ClassNotFoundException lors du débogage des mêmes JUNIT.

J'ai essayé toutes sortes de solutions différentes disponibles sur Stackoverflow.com et sur les forums ailleurs, mais rien ne semble fonctionner. Après m'être cogné la tête avec ces problèmes pendant près de deux jours, j'ai finalement trouvé la solution.

Si aucune des solutions ne semble fonctionner, supprimez simplement le dossier .metadata créé dans votre espace de travail. Cela créerait une surcharge supplémentaire pour l'importation des projets et de toutes sortes de configurations que vous avez effectuées, mais celles-ci résoudront sûrement ces problèmes.

J'espère que cela aide.

Nayan
la source
En guise de note ... cela vous demandera de reconstruire votre environnement. Donc, même si cela peut être une solution, sachez ce que vous êtes sur le point de faire ...
Bob
0

Ces étapes ont fonctionné pour moi.

  • Supprimez le contenu du référentiel Maven local.
  • exécutez mvn clean install dans la ligne de commande. (cd dans le répertoire pom).
  • Créer un projet dans Eclipse.
Jake Graham Arnold
la source
0

1- Éclipse mvn: éclipse

2- projet nettoyer tous les projets

3- redémarrer

Toumi
la source
0

Il convient de mentionner comme autre réponse que si vous utilisez eGit et que votre chemin de classe est mis à jour à cause, par exemple, d'un outil de couverture de test comme Clover, il y a parfois un hoquet de nettoyage qui ne supprime pas complètement le contenu de /path/to/git/repository/<project name>/bin/

Essentiellement, j'ai utilisé la vue du journal des erreurs d'Eclipse, identifié ce qui causait des problèmes pendant cet effort de nettoyage, navigué vers le répertoire source et supprimé manuellement le <project name>/binrépertoire. Une fois cela terminé, je suis retourné à Eclipse et F5j'ai actualisé ( ) mon projet et l'erreur a disparu.

Blake Neal
la source
0

Vérifiez si votre projet est ouvert en tant que projet Maven et pas seulement en tant que projet Java standard. En fait, une évidence, mais c'est exactement la même raison pour laquelle vous pourriez le manquer.

Ben
la source
0

Cela peut également être dû à "[ERREUR] Aucun compilateur n'est fourni dans cet environnement. Peut-être que vous utilisez un JRE plutôt qu'un JDK?"

William
la source
0

J'avais fait face au même problème. Je l'ai résolu en supprimant la dépendance externe JUnit jar que j'ai ajoutée par téléchargement à partir d'Internet en externe. Mais ensuite je suis allé à projet-> propriétés-> chemin de construction-> ajouter une bibliothèque-> junit-> choisi la version (ex junit4) -> appliquer.

Il a automatiquement ajouté la dépendance. cela a résolu mon problème.

Agniva Dutta
la source
0

Faire des modifications factices et enregistrer la classe de test peut résoudre le problème. Il construira le .class automatiquement

Lorenzo Lerate
la source
0

Il semble problème de compilation. Exécutez le projet en tant que test Maven, puis Exécuter en tant que test JUnit.

Yao Li
la source
0

Veuillez vérifier si vous avez ajouté junit4 en tant que dépendance.

par exemple

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
Ishan Liyanage
la source
-5

Vous avez peut-être oublié de placer la classe Main et la classe Test Case dans / src / test / java. Vérifiez-le une fois.

Sathya
la source
1
java.lang.ClassNotFoundException survient lorsque la classe est déjà compilée mais à l'exécution en raison d'un chemin de classe non défini correctement.
Nitin Mahesh