Исключение класса не найдено при запуске теста JUnit


117

Я получаю эту ошибку при запуске теста JUnit в 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)

Я пробовал добавить JUnitбиблиотеку в путь к классам, хотя я использую maven, а библиотека JUnit находится в зависимости от POM.

Я уже пробовал очистить проект и создал новый тестовый пример JUnit, используя плагин JUnit для Eclipse, но по-прежнему получаю ту же ошибку.


10
попробуйте запустить, как mvn clean testтолько он скомпилирует все тестовые классы
Джигар Джоши

1
Не могли бы вы проверить, есть ли com.myproject.server.MyTest в папке bin? Я имею в виду, что если он не скомпилирован из-за ошибки компиляции или пути сборки, вы получите эту ошибку.
vikas

вы тестируете один класс или весь проект?
Doszi89


1
В моем случае запуск тестов с использованием Maven работал, но если я щелкну правой кнопкой мыши тестовый класс и выберу «Запуск от имени» -> JUnit Test, он сообщит об исключении ClassNotFoundException. Я исправил это, щелкнув проект правой кнопкой мыши и выбрав «Свойства» -> «Строители», а затем переместив Maven Project Builder над Java Builder
xorcus

Ответы:


121

Похоже, это происходит потому, что при использовании компилируется только исходный код mvn clean compile(я использую maven 3.1.0, поэтому я не уверен, всегда ли он так себя вел).

Если вы запустите mvn test, тестовый код также будет скомпилирован, но затем он запустит тесты (что может быть нежелательно сразу, если вы пытаетесь запустить их через Eclipse). Способ обойти это - добавлять test-compileв вашу последовательность команд Maven всякий раз, когда вы делаете mvn clean. Например, вы бы сбежали mvn clean compile test-compile.


1
У меня это произошло один раз, и ответ slomek сработал, а затем эта же ошибка повторилась, поэтому мне пришлось попробовать и это. Теперь он снова работает нормально, так что на всякий случай вы можете сделать обе эти вещи.
Роджер

Спасибо, у меня это сработало. Но в моем случае он не работал до конца и снова открыл проект в eclipse.
Paramesh Korrakuti

Проще говоря, выполните «mvn clean test-compile», а затем запустите тесты Junit в eclipse. У меня это сработало. Спасибо.
Sreram

104

У меня была аналогичная проблема с моими тестами, и я где-то в Интернете обнаружил, что вам нужно перейти к пути сборки в свойствах вашего проекта и переместить зависимости Maven выше системной библиотеки JRE . Похоже, у меня это сработало.


1
Спасибо, это решило мою проблему. Фактический тест получал ошибку class not found, когда я пытался его запустить. Я думаю, что это, вероятно, предпочтительный первый шаг перед добавлением дополнительных целей сборки mvn.
Роджер

8
Этот метод описан со скриншотами в этом посте (на случай, если шаги не ясны из ответа @ slomek выше)
nhylated

2
Я не мог переместить Maven Managed Dependencies выше JRE System Library в Eclipse Mars 2, но я мог щелкнуть правой кнопкой мыши по проекту и перейти в Properties -> Builders, а затем переместить Maven Project Builder над Java Builder, и это сработало для меня.
xorcus

Я попробовал все вышеперечисленное, и это не сработало, я также не мог переместить Maven Dependencies в JRE System Library, но это было на вкладке Libraries. Затем я перешел в «Путь сборки» -> «Порядок и экспорт» ->, так как смог переместить зависимости Maven выше системной библиотеки JRE. Затем я построил проект и запустил установку Maven, после чего тест прошел успешно.
Меган

22

Я столкнулся с той же проблемой, и я смог исправить ее с помощью ответа @ slomek, но после этого проблема возникла снова.

Наконец, я исправил это, добавив папку вывода моего проекта в конфигурацию запуска теста JUnit. Шаги:

  • Найдите папку вывода вашего проекта из Project properties -> Java Build Path -> Default output folder
    • Обычно это <project-folder>/bin
  • Перейти к Run -> Run Configurations...
  • Щелкните конфигурацию запуска модульного теста и перейдите на Classpathвкладку
  • Явно добавьте папку вывода вашего проекта User Entries- даже если проект уже включен в нее
    • Нажмите, Advanced -> Add folderчтобы добавить выходную папку

Эта проблема может быть связана со странной настройкой проекта в Eclipse - например, исходная папка с вложенными проектами maven, импортированными как один проект / папка (по крайней мере, так был настроен мой проект).


Огромное спасибо; У меня была такая проблема. Ваше исправление сработало для меня; две верхние - нет. Проголосовали "за".
Давтом 07

Абсолютно блестящий! Целую вечность ломаю голову над этим. Спасибо!
RayCh

17

Если эта проблема возникает только в Eclipse, может помочь выполнение команды Project -> Clean ... для выбранного проекта.


Спасибо - это действительно сработало для меня - JAVE EE eclipse gradlew
Абдели Чанданвала

11

Попробовав все здесь без каких-либо улучшений, я решил свою проблему, просто перезапустив Eclipse.


5

Я исправил свою проблему, запустив обновление maven. Щелкните правой кнопкой мыши проект вашего проекта> Maven> Обновить проект


3

В моем случае у меня была неправильная структура каталогов maven.

Что должно быть примерно так:

/ SRC / тест / Java / com.myproject.server.MyTest

После того, как я это исправил - все заработало как шарм.


2

В моем случае решить эту проблему помогли только следующие шаги:

  1. Проект-> свойства-> Параметры запуска / отладки.
  2. В «Конфигурации запуска для '.....'» выберите классы / проекты
  3. Правка -> Путь к классам -> «Восстановить записи по умолчанию»

Спасибо!! Только этот мне помог !!
sumandas 08

1

Раньше в этом случае я всегда делал mvn eclipse:eclipse и перезапускал Eclipse, и это работало. После перехода на GIT он у меня перестал работать, что несколько странно.

Основная проблема здесь в том, что Mr Eclipse не находит скомпилированный класс. Затем я устанавливаю папку вывода как Project / target / test-classes, которая по умолчанию создаетсяmvn clean install без пропуска теста, и перешел к следующему обходному пути:

Вариант 1. Задайте путь к классам для каждого тестового примера

Eclipse -> Run -> Run Configurations -> под JUnit-> выберите mytest -> на вкладке classpath-> Select User Entries-> Advanced-> Add Folder -> Select -> Apply-> Run

Вариант 2. Создайте переменную пути к классам и включите ее в путь к классам для всех тестовых случаев.

Eclipse -> Windows -> Переменные пути к классам -> Создать -> [Имя: Junit_test_cases_cp | путь:] -> ok Затем перейдите в Eclipse-> Run -> Run Configurations -> JUnit-> выберите mytest -> на вкладке classpath -> Select User Entries-> Advanced-> Add classpath variables-> Select Junit_test_cases_cp-> ok- > Применить-> Выполнить

Это единственное, что у меня сейчас работает после того, как я попробовал все предложения в Интернете.


1

У меня была такая же проблема с проектом Gradle с тестовым SourceSet с двумя каталогами ресурсов.

Этот фрагмент взят из main-module.gradle и добавляет каталог ресурсов в тестовый SourceSet:

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

При этом у меня было два каталога ресурсов, связанных с тестовым SourceSet главного модуля проекта:

../other-module/src/test/resources src / test / resources (относительно папки основного модуля, автоматически добавляемой плагином java)

Я обнаружил, что если у меня было два файла с одинаковыми именами в обоих исходных каталогах, что-то на этапе ресурсов процесса пошло не так. В результате компиляция не началась, и по этой причине никакие .class не были скопированы в каталог bin, где JUnit искал классы. Исключение ClassNotFoundException исчезло после переименования одного из двух файлов.


1

NoClassDefFoundError на самом деле означает, что он не может инициализировать класс. Нет ничего общего с поиском класса. Я получил эту ошибку при вызове trim () для нулевой строки.

JUnit не отображает исключение NullPointerException. Строка не является нулевой при нормальной работе, потому что я беру строку из файла свойств, который недоступен для тестов.

Мой совет - убирать предметы из класса, пока ваши тесты не начнут сдавать.Затем вы можете определить, какая строка выдает ошибку.


0

У меня была аналогичная проблема с моим Eclipse Helios, который отлаживает Junits. Моя проблема была немного другой, так как я смог успешно запустить Junits, но когда я получал ClassNotFoundException при отладке тех же JUNIT.

Я пробовал всевозможные решения, доступные на Stackoverflow.com и форумах в других местах, но, похоже, ничего не работает. После того, как я бился головой об этой проблеме почти два дня, я, наконец, нашел решение.

Если ни одно из решений не работает, просто удалите папку .metadata, созданную в вашей рабочей области. Это создало бы дополнительные накладные расходы на импорт проектов и всех видов конфигурации, которые вы сделали, но это, несомненно, решит эту проблему.

Надеюсь, это поможет.


В качестве примечания ... для этого вам потребуется перестроить среду. Так что, пока это может быть решением, просто знайте, что вы собираетесь делать ...
Боб

0

Эти шаги сработали для меня.

  • Удалите содержимое локального репозитория Maven.
  • запустите mvn clean install в командной строке. (cd в каталог pom).
  • Сборка проекта в Eclipse.

0

1- mvn eclipse: затмение

2- проект очистить все проекты

3- перезапуск


0

В качестве еще одного ответа стоит упомянуть, что если вы используете eGit и ваш путь к классам обновляется из-за, скажем, инструмента тестового покрытия, такого как Clover, иногда возникает сбой при очистке, который не полностью удаляет содержимое /path/to/git/repository/<project name>/bin/

По сути, я использовал представление журнала ошибок Eclipse, определил, что вызывало проблемы во время этой очистки, перешел в исходный каталог и вручную удалил <project name>/binкаталог. Когда это закончилось, я вернулся в Eclipse и обновил ( F5) свой проект, и ошибка исчезла.


0

Убедитесь, что ваш проект открыт как проект Maven, а не как обычный проект Java. На самом деле это и ежу понятно, но по этой же причине вы можете его пропустить.


0

Это также может быть связано с тем, что «[ОШИБКА] В этой среде нет компилятора. Возможно, вы работаете на JRE, а не на JDK?»


0

Я столкнулся с той же проблемой. Я решил это, удалив внешнюю зависимость JUnit jar, которую я добавил путем загрузки из Интернета извне. Но затем я пошел в проект-> свойства-> путь сборки-> добавить библиотеку-> junit-> выбрал версию (ex junit4) -> применить.

Он автоматически добавил зависимость. это решило мою проблему.


0

Внесение фиктивных изменений и сохранение тестового класса может решить проблему. Он автоматически построит .class


0

Кажется проблема компиляции. Запустите проект как тест Maven, затем запустите как тест JUnit.



0

Пожалуйста, проверьте, добавили ли вы junit4 в качестве зависимости.

например

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

-5

Может быть вы забыли поместить главный класс и тестовый класс Case в / SRC / тест / Java. Проверьте это один раз.


1
java.lang.ClassNotFoundException возникает, когда класс уже скомпилирован, но во время выполнения из-за неправильной установки пути к классам.
Нитин Махеш
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.