Eclipse Не найдено ни одного теста с использованием JUnit 5, вызванного NoClassDefFoundError для LauncherFactory
Проблема
Всякий раз, когда я запускаю свои проекты JUnit test (используя JUnit 5 с Java 9 и Eclipse Oxygen 1.a), я сталкиваюсь с проблемой, что eclipse не может найти никаких тестов.
Описание
В конфигурации запуска eclipse не может даже найти метод, который аннотируется с помощью @Test, но вместо этого отображает только "(все методы)".
Следующая картина, надеюсь, дает лучшие взгляды на мои настройки:
![https://imgur.com/a/FTe9c]()
Выход консоли:
java.lang.NoClassDefFoundError: org/junit/platform/launcher/core/LauncherFactory
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.<init>(JUnit5TestLoader.java:31)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.base/java.lang.Class.newInstance(Unknown Source)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createRawTestLoader(RemoteTestRunner.java:368)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createLoader(RemoteTestRunner.java:363)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.defaultInit(RemoteTestRunner.java:307)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.init(RemoteTestRunner.java:222)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.launcher.core.LauncherFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 11 more
То, что я пробовал до сих пор
Я уже пробовал
- удалить тестовую папку из пути сборки и добавить ее снова.
- чтобы запустить тест с зависанием метода, аннотированного с помощью @Test, а затем нажмите "Запустить как тест JUnit".
- удалите JUnit из пути Buildpath и добавьте его снова
- перезапустить eclipse
- Я также перевел весь проект проекта с одного компьютера на другой и попробовал его с установленной установкой eclipse.
- чтобы переименовать метод тестирования.
- чтобы повторить аннотацию @Test
Некоторые из этих шагов можно найти здесь, но в конце концов проблема осталась.
Ответы
Ответ 1
Вы столкнулись с ошибкой Eclipse 525948, которая уже исправлена и будет опубликована в предстоящем выпуске Oxygen.3 (4.7.3), 21 марта 2018 г.
Как обходной путь поместите свой тестовый код в отдельный проект и добавьте тестируемый проект в путь к модулю, но не добавляйте module-info.java
в свой тестовый проект. С вашим проектом, именем класса и модуля, он должен выглядеть примерно так:
![введите описание изображения здесь]()
Смотрите также мое видео, которое показывает Java 9 и JUnit 5 в Eclipse Oxygen.1a в действии
Ответ 2
У меня такая же проблема с STS 3.9.1. Однако, похоже, это ошибка Eclipse, чтобы исправить это, вы можете добавить к вашему проекту тестовую зависимость junit-platform-launcher
(https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher)
Так я сделал для своего проекта, который использует gradle:
dependencies {
// other stuff here
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "5.${junit5MinorVersion}"
testCompile group: 'org.junit.platform', name: 'junit-platform-launcher', version: "1.${junit5MinorVersion}"
}
gradle.properties:
junit5MinorVersion=1.0
Я считаю, что то же самое относится, если вы видите это исключение, используя IntelliJ IDEA.
Ответ 3
Я исправил проблему, щелкнув правой кнопкой мыши по тесту и выбрав "Run Configurations" и изменив выбор "Runner:" на "JUnit 4", как показано здесь:
![Screenshot of run configruations]()
Я снова запустил тест, и он сработал.
Ответ 4
Ответы до сих пор не решали проблему обмена кодом с другими людьми, которые не обязательно используют Eclipse. Вот одно предложение. Ключ должен использовать профиль maven для решения Eclipse Case.
Предполагается, что вы определили свойство junit5.version
в вашем pom, например:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit5.version>5.1.1</junit5.version>
</properties>
затем в разделе profiles
добавьте следующее:
<profiles>
<profile>
<id>eclipse</id>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit5.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.1.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</profile>
</profiles>
Все, что вам нужно сделать после этого, это выбрать профиль в вашем локальном Eclipse: щелкните правой кнопкой мыши по своему проекту и выберите Maven > Select Maven Profiles...
(или нажмите Ctrl + Alt + P), а затем проверьте профиль "eclipse", который мы только что создали.
![Selection Of Maven Profile]()
С этим вы сделали. Ваш Eclipse будет запускать тесты Junit 5, как и ожидалось, но добавленная вами конфигурация не будет загрязнять другие сборки или другую IDE
Ответ 5
Следуя Андрею Караиванскому, ответьте здесь выражение Maven POM:
<properties>
...
<junit-jupiter.version>5.2.0</junit-jupiter.version>
<junit-platform.version>1.2.0</junit-platform.version>
...
</properties>
<dependencies>
...
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit-jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${junit-platform.version}</version>
<scope>test</scope>
</dependency>
...
</dependencies>
UPDATE
Согласно комментарию Александра Весселя вы можете использовать org.junit: junit-bom, как описано в его ответе на вопрос Eclipse. Не найдено ни одного теста с использованием JUnit. 5 вызвано NoClassDefFoundError для LauncherFactory.
Ответ 6
В моем случае проблема была у меня, а не у IDE, как у Eclipse. Я импортировал класс JUnit 4 Test.
Так что НЕ импортируйте это:
import org.junit.Test // JUnit 4
Но импортируйте это:
import org.junit.jupiter.api.Test // JUnit 5
Ответ 7
Ни одно из решений не помогло:
Проблема в том, что Eclipse 2018-12 имеет поддержку JUnit 5.3.1. Если вы запустите его с версией до этого, он потерпит неудачу.
Поэтому убедитесь, что вы используете хотя бы 5.3.1.
5.4.0 тоже работает.
Если ваш родительский pom - Spring Boot, вам нужно убедиться (в управлении зависимостями), что junit-jupiter-api установлен на ту же версию. Вам не нужен бегун на платформе junit или -launcher !
Ответ 8
Использование STS 3.9.1 У меня такая же проблема. Однако в настоящее время я не требую никаких новых функций JUnit5, поэтому я попытался использовать более старую версию. Если вы используете maven, вы можете добавить следующие зависимости к вашему pom.xml:
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${junit.platform.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit.vintage.version}</version>
<scope>test</scope>
</dependency>
Это сделало трюк для меня (по крайней мере, пока мне не нужен JUnit5 явно).
Ответ 9
У меня возникла такая же проблема после создания новой TestCase: Eclipse → New → JUnit Test Case. Он создает класс без модификатора уровня доступа. Я мог бы решить проблему, просто разместив публикацию перед ключевым словом класса.
Ответ 10
К вашему сведению, еще одна причина "не найдено тестов с использованием junit5" (непреднамеренно или намеренно) объявляет тестовые наборы "частными":
// Example of test case that doesn't get included
@Test
private void testSomeMethod() {
}
Они должны быть публичными.
Ответ 11
Как все сообщили об ошибке IDE, я попробовал в Eclipse
и STS
. В обоих случаях это терпит неудачу.
В качестве обходного пути я исправил, изменив файл pom.xml, как показано ниже.
Я добавил эти две maven-зависимости junit-jupiter-engine
и junit-platform-launcher
.
pom.xml
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit-jupiter.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform launcher -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${junit-platform.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
Также, пожалуйста, убедитесь, что добавили версию обоих maven зависимостей в теге properties.
<properties>
<java.version>1.8</java.version>
<junit-jupiter.version>5.2.0</junit-jupiter.version>
<junit-platform.version>1.2.0</junit-platform.version>
</properties>
Ответ 12
Добавление этой зависимости maven с JUnit Jupiter (v.5.5.1) решает проблему.
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>
Ответ 13
Та же ошибка, с которой я столкнулся в версии Oxygen.3a Eclipse Release (4.7.3a). Существует проблема в несовпадении зависимостей Maven. Чтобы решить, я обновил свой Pom.xml со следующими зависимостями.
http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0 com.netapp.junitnmactiopractice JunitAndMactioPractice 0.0.1-SNAPSHOT
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<junit.jupiter.version>5.1.1</junit.jupiter.version>
<junit.platform.version>1.1.1</junit.platform.version>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>${junit.platform.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
Ответ 14
Так как здесь невозможно разместить блоки кода в комментариях, здесь используется шаблон POM, который я использую в проектах, требующих JUnit 5. Это позволяет создавать и "запускать как тест JUnit" в Eclipse и создавать проект с простым Maven.
<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>group</groupId>
<artifactId>project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>project name</name>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.3.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<!-- only required when using parameterized tests -->
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Вы можете видеть, что теперь вам нужно обновить версию только в одном месте, если вы хотите обновить JUnit. Кроме того, номер версии платформы не должен появляться (в совместимой версии) где-либо в вашем POM, он автоматически управляется через junit-bom
.
Ответ 15
Я использую затмение 2019-09.
Мне пришлось обновить версию junit-bom как минимум до 5.4.0. Ранее у меня был 5.3.1, и это вызвало те же симптомы ОП.
Мой конфиг сейчас:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.5.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Ответ 16
С самого начала в сообщении об ошибке сообщается, что класс не найден: NoClassDefFoundError
означает, что проблема заключается в пути PATH к junit.
Нажмите правой кнопкой мыши на папку проекта и выберите "Свойства" ИЛИ выберите папку проекта и нажмите комбинацию cmd + i.
выберите из списка "Путь сборки Java".
- выберите вкладку "Библиотеки"
- Если JUnit 5 (или JUnit 4) добавлен в "Modulepath", выберите "JUnit 5" и нажмите "Удалить".
- выберите "Classpath", нажмите "Добавить библиотеку...".
- В открывшемся окне "Добавить библиотеку" выберите "JUnit", нажмите "Далее".
- Выберите нужную версию библиотеки JUnit и нажмите Готово.
Вот и все. Попробуйте запустить тест еще раз.
Ответ 17
Добавьте в свой POM:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.3.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>