Wyjątek Nie znaleziono klasy podczas uruchamiania testu JUnit

117

Otrzymuję ten błąd podczas uruchamiania testu JUnit w 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)

Próbowałem dodać JUnitbibliotekę w ścieżce klas, chociaż używam mavena, a biblioteka JUnit jest zależna od POM.

Próbowałem już wyczyścić projekt i utworzyłem nowy przypadek testowy JUnit za pomocą wtyczki JUnit dla Eclipse, nadal otrzymując ten sam błąd.

kwarki
źródło
10
spróbuj uruchomić mvn clean test, skompiluje wszystkie klasy testowe
Jigar Joshi,
1
Czy możesz sprawdzić, czy w folderze bin znajduje się com.myproject.server.MyTest? Mam na myśli, że jeśli nie jest skompilowany z powodu błędu kompilacji lub ścieżki kompilacji, otrzymasz ten błąd.
vikas
testujesz jedną klasę czy cały projekt?
Doszi89,
Możliwy duplikat Eclipse - java.lang.ClassNotFoundException
Amos M. Carpenter
1
W moim przypadku uruchomienie testów przy użyciu Mavena zadziałało, ale jeśli kliknę prawym przyciskiem myszy na klasę testową i wybiorę Uruchom jako -> JUnit Test, zgłosiło to ClassNotFoundException. Naprawiłem to, klikając prawym przyciskiem myszy projekt i przechodząc do Właściwości -> Konstruktorzy, a następnie przenosząc Maven Project Builder nad Java Builder
xorcus

Odpowiedzi:

121

Wydaje się, że dzieje się tak, ponieważ podczas używania kompiluje się tylko kod źródłowy mvn clean compile(używam maven 3.1.0, więc nie jestem pewien, czy zawsze zachowywał się w ten sposób).

Jeśli uruchomisz mvn test, kod testowy również się skompiluje, ale następnie uruchomi testy (co może nie być natychmiast pożądane, jeśli próbujesz uruchomić je przez Eclipse). Sposób na obejście tego polega na dodaniu test-compiledo sekwencji poleceń Mavena, ilekroć robisz mvn clean. Na przykład biegłbyś mvn clean compile test-compile.

Newtrino
źródło
1
Raz zdarzyło mi się to i odpowiedź Slomka zadziałała, a potem ten sam błąd się powtórzył, więc też musiałem spróbować. Teraz znowu działa dobrze, więc dla bezpieczeństwa możesz zrobić obie te rzeczy.
Roger,
Dzięki, zadziałało dla mnie. Ale w moim przypadku nie działało do zamknięcia i ponownie otworzyło projekt w zaćmieniu.
Paramesh Korrakuti
W prostych słowach wykonaj „mvn clean test-compile”, a następnie uruchom testy Junit w eclipse. U mnie zadziałało. Dzięki.
Sreram
103

Miałem podobny problem z moimi testami i znalazłem gdzieś w sieci, że musisz przejść do Build Path we właściwościach swojego projektu i przenieść Maven Dependencies powyżej JRE System Library . Wydaje się, że to zadziałało.

slomek
źródło
1
Dzięki temu rozwiązałem mój problem. Rzeczywisty test powodował, że klasa nie została znaleziona, gdy próbowałem ją uruchomić. Myślę, że jest to prawdopodobnie preferowany pierwszy krok przed dodaniem dodatkowych celów kompilacji mvn.
Roger,
8
Ta metoda jest opisana na zrzutach ekranu w tym poście (na wypadek, gdyby kroki nie były jasne z powyższej odpowiedzi @ slomek)
nhylated
2
Nie mogłem przenieść Maven Managed Dependencies powyżej JRE System Library w Eclipse Mars 2, ale mogłem kliknąć projekt prawym przyciskiem myszy i przejść do Właściwości -> Builders, a następnie przenieść Maven Project Builder powyżej Java Builder i to zadziałało dla mnie.
xorcus
Wypróbowałem wszystkie powyższe i nie zadziałało, nie mogłem też przenieść zależności Mavena na temat biblioteki systemowej JRE, ale było to na karcie Biblioteki. Następnie przeszedłem do Build Path -> Order & Export ->, ponieważ mogłem przenieść zależności Maven powyżej biblioteki JRE System. Następnie zbudowałem projekt i uruchomiłem instalację Mavena, a następnie test przebiegał pomyślnie.
Megan
22

I w obliczu tego samego problemu i udało mi się go naprawić za pomocą przycisku @ slomek za odpowiedź , ale problem pojawił się ponownie po tym.

W końcu naprawiłem to, dodając folder wyjściowy mojego projektu do konfiguracji uruchamiania testu JUnit. Kroki to:

  • Znajdź folder wyjściowy swojego projektu z Project properties -> Java Build Path -> Default output folder
    • Zwykle tak jest <project-folder>/bin
  • Iść do Run -> Run Configurations...
  • Kliknij konfigurację uruchamiania testu jednostkowego i kliknij Classpathkartę
  • Jawnie dodaj folder wyjściowy projektu w User Entries- nawet jeśli projekt jest już tam zawarty
    • Kliknij, Advanced -> Add folderaby dodać folder wyjściowy

Ten problem może być spowodowany dziwną konfiguracją projektu w Eclipse - np. Folder źródłowy z zagnieżdżonymi projektami maven zaimportowanymi jako pojedynczy projekt / folder (przynajmniej tak został skonfigurowany mój projekt).

nylowany
źródło
Dziękuję bardzo; Miałem ten problem. Twoja poprawka zadziałała dla mnie; dwie pierwsze nie. Głosowano za.
davtom
Absolutnie genialne! Przez wieki drapałem się w głowę. Dzięki!
RayCh
17

Jeśli ten problem występuje tylko w Eclipse, może pomóc wykonanie polecenia Projekt -> Wyczyść ... na wybranym projekcie.

johanwannheden
źródło
Dzięki - dla mnie faktycznie zadziałało - JAVE EE eclipse gradlew
Abdeali Chandanwala
11

Po wypróbowaniu wszystkiego tutaj bez poprawy rozwiązałem problem, po prostu ponownie uruchamiając Eclipse

Berit Larsen
źródło
5

Naprawiłem mój problem, uruchamiając aktualizację maven. Kliknij prawym przyciskiem myszy projekt swój projekt> Maven> Aktualizuj projekt

Azjański
źródło
3

W moim przypadku miałem złą strukturę katalogów maven.

Który powinien wyglądać następująco:

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

Po tym, jak to naprawiłem - wszystko działało jak urok.

ITisha
źródło
2

W moim przypadku dopiero kolejne kroki pomogły mi rozwiązać ten problem:

  1. Projekt-> właściwości-> Ustawienia uruchamiania / debugowania.
  2. W „Uruchom konfiguracje dla '.....'” wybierz klasy / projekty
  3. Edycja -> Ścieżka klas -> „Przywróć wpisy domyślne”
Roman Romaniuk
źródło
Dzięki!! Tylko ten mi pomógł !!
sumandy
1

Wcześniej w tym przypadku zawsze robiłem mvn eclipse:eclipsei restartowałem Eclipse i działało. Po migracji do GIT przestał działać dla mnie, co jest nieco dziwne.

Podstawowy problem polega na tym, że Mr Eclipse nie znajduje skompilowanej klasy. Następnie ustawiłem folder wyjściowy jako Project / target / test-classes, który jest domyślnie generowany mvn clean installbez pomijania testu i wykonałem następujące obejście:

Opcja 1: Ustaw ścieżkę klas dla każdego przypadku testowego

Eclipse -> Uruchom -> Run Configurations -> w JUnit-> wybierz mytest -> w zakładce classpath -> Select User Entries -> Advanced -> Add Folder -> Select -> Apply -> Run

Opcja 2: Utwórz zmienną classpath i dołącz ją do classpath dla wszystkich przypadków testowych

Eclipse -> Windows -> Zmienne ścieżki klas -> Nowy -> [Nazwa: Junit_test_cases_cp | path:] -> ok Następnie przejdź do Eclipse-> Run -> Run Configurations -> JUnit-> wybierz mytest -> w zakładce classpath -> Select User Entries-> Advanced-> Add classpath variable-> Select Junit_test_cases_cp-> ok- > Zastosuj-> Uruchom

To jedyna rzecz, która obecnie działa dla mnie po wypróbowaniu wszystkich sugestii online.

user3222211
źródło
1

Miałem ten sam problem z projektem Gradle z testowym zestawem SourceSet z dwoma katalogami zasobów.

Ten fragment pochodzi z pliku main-module.gradle i dodaje katalog zasobów do testowego zestawu SourceSet:

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

Robiąc to, miałem dwa katalogi zasobów związane z testowym zestawem źródłowym głównego modułu projektu:

../other-module/src/test/resources src / test / resources (względem folderu głównego modułu, automatycznie dodawane przez wtyczkę java)

Dowiaduję się, że gdybym miał dwa pliki o tej samej nazwie w obu katalogach źródłowych, coś na etapie zasobów procesu poszło nie tak. W rezultacie kompilacja nie została rozpoczęta iz tego powodu żadne pliki .class nie zostały skopiowane do katalogu bin, w którym JUnit szukał klas. Wyjątek ClassNotFoundException zniknął po prostu zmieniając nazwę jednego z dwóch plików.

David Obber
źródło
1

NoClassDefFoundError naprawdę oznacza, że ​​nie może zainicjować klasy. Nie ma to nic wspólnego ze znalezieniem klasy. Wystąpił ten błąd podczas wywoływania funkcji trim () w łańcuchu o wartości null.

JUnit nie pokaże wyjątku NullPointerException. Ciąg nie jest null podczas normalnego działania, ponieważ pobieram ciąg z pliku właściwości, który nie jest dostępny do testów.

Radzę usuwać fragmenty z zajęć, dopóki testy nie zaczną przechodzić. Następnie możesz określić, która linia powoduje błąd.

Philip Rego
źródło
0

Miałem podobny problem z moim Eclipse Helios, który debuguje Junity. Mój problem był trochę inny, ponieważ udało mi się pomyślnie uruchomić Junits, ale kiedy otrzymałem ClassNotFoundException podczas debugowania tych samych JUNITów.

Próbowałem różnych rozwiązań dostępnych na Stackoverflow.com i forach w innych miejscach, ale wydaje się, że nic nie działa. Po prawie dwóch dniach walenia głową w ten problem, w końcu znalazłem rozwiązanie.

Jeśli żadne z rozwiązań nie działa, po prostu usuń folder .metadata utworzony w obszarze roboczym. Spowodowałoby to dodatkowe obciążenie związane z importowaniem projektów i wszelkiego rodzaju konfiguracji, które wykonałeś, ale z pewnością rozwiążą ten problem.

Mam nadzieję, że to pomoże.

Nayan
źródło
Uwaga… zrobienie tego będzie wymagało odbudowania środowiska. Więc chociaż może to rozwiązać, po prostu bądź świadomy tego, co zamierzasz zrobić ...
Bob
0

Te kroki zadziałały dla mnie.

  • Usuń zawartość lokalnego repozytorium Maven.
  • uruchom mvn clean install w wierszu poleceń. (cd do katalogu pom).
  • Zbuduj projekt w Eclipse.
Jake Graham Arnold
źródło
0

1- mvn eclipse: eclipse

2 - projekt wyczyść wszystkie projekty

3- Uruchom ponownie

Toumi
źródło
0

Warto wspomnieć jako kolejną odpowiedź, że jeśli używasz eGit, a twoja ścieżka klas jest aktualizowana z powodu, powiedzmy, narzędzia do pokrywania testów, takiego jak Clover, to czasami pojawia się czkawka czyszczenia, która nie usuwa całkowicie zawartości /path/to/git/repository/<project name>/bin/

Zasadniczo skorzystałem z widoku dziennika błędów Eclipse, zidentyfikowałem, co powoduje problemy podczas czyszczenia, przeszedłem do katalogu źródłowego i ręcznie usunąłem <project name>/binkatalog. Po zakończeniu wróciłem do Eclipse i odświeżyłem ( F5) mój projekt, a błąd zniknął.

Blake Neal
źródło
0

Sprawdź, czy Twój projekt jest otwarty jako projekt Maven, a nie zwykły projekt Java. Właściwie to oczywiste, ale to jest dokładnie ten sam powód, dla którego możesz to przegapić.

Ben
źródło
0

Może to być również spowodowane komunikatem „[BŁĄD] W tym środowisku nie ma kompilatora. Być może korzystasz z JRE, a nie JDK?”

William
źródło
0

Miałem ten sam problem. Rozwiązałem to, usuwając zewnętrzną zależność jar JUnit, którą dodałem, pobierając z Internetu zewnętrznie. Ale potem poszedłem do projektu-> właściwości-> ścieżka kompilacji-> dodaj bibliotekę-> junit-> wybrałem wersję (ex junit4) -> zastosuj.

Automatycznie dodała zależność. rozwiązało mój problem.

Agniva Dutta
źródło
0

Wprowadzenie fałszywej zmiany i zapisanie klasy testowej może rozwiązać problem. Automatycznie zbuduje .class

Lorenzo Lerate
źródło
0

Wydaje się, że problem z kompilacją. Uruchom projekt jako test Maven, a następnie Uruchom jako test JUnit.

Yao Li
źródło
0

Pls sprawdź, czy dodałeś junit4 jako zależność.

na przykład

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>
Ishan Liyanage
źródło
-5

Być może zapomniałeś umieścić klasę Main i Test Case w / src / test / java. Sprawdź to raz.

Sathya
źródło
1
Wyjątek java.lang.ClassNotFoundException pojawia się, gdy klasa jest już skompilowana, ale w czasie wykonywania z powodu nieprawidłowego ustawienia ścieżki klasy.
Nitin Mahesh