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.

  1. Нажмите правой кнопкой мыши на папку проекта и выберите "Свойства" ИЛИ выберите папку проекта и нажмите комбинацию cmd + i.

  2. выберите из списка "Путь сборки Java".

  3. выберите вкладку "Библиотеки"
  4. Если JUnit 5 (или JUnit 4) добавлен в "Modulepath", выберите "JUnit 5" и нажмите "Удалить".
  5. выберите "Classpath", нажмите "Добавить библиотеку...".
  6. В открывшемся окне "Добавить библиотеку" выберите "JUnit", нажмите "Далее".
  7. Выберите нужную версию библиотеки 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>