web-dev-qa-db-ja.com

NoClassDefFoundErrorによるEclipse JUnit 5を使用したテストは見つかりませんでした。

問題

私のプロジェクトのJUnitテスト(Java 9とEclipse Oxygen 1.aでJUnit 5を使用)を実行するたびに、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でアノテーションが付けられたメソッドの上にカーソルを置いてテストを開始し、[Run as JUnit Test]をクリックします。
  • buildpathからJUnitを削除して、もう一度追加してください
  • eclipseを再起動します
  • また、プロジェクト全体をあるマシンから別のマシンに移動し、そこで提供されているEclipseをインストールして試しました。
  • テストメソッドの名前を変更します。
  • @Testアノテーションを再入力する

これらのステップのいくつか ここで見つけることができます 、しかし結局問題は残りました。

51
ShadowDragon

あなたは Eclipse bug 525948 に遭遇しました。これはすでに修正されていて、次のリリースで公開されるでしょうOxygen.3(4.7) .3)、2018年3月21日。

回避策として、テストコードを別のプロジェクトに配置し、テスト対象のプロジェクトをモジュールパスに追加します。ただし、module-info.Javaをテストプロジェクトに追加しないでください。プロジェクト、クラス、およびモジュールの命名では、次のようになります。

enter image description here

Eclipse Oxygen.1aのJava 9とJUnit 5の動作を示す私のビデオ もご覧ください

16
howlger

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の使用中にこの例外が発生した場合も同様です。

45

テストを右クリックして[Run Configurations]を選択し、次に示すように[Test runner:]の選択を[JUnit 4]に変更して問題を解決しました。

Screenshot of run configruations

私は再びテストを実行しました、そしてそれはうまくいきました。

25
stringVector

これまでの回答では、必ずしもEclipseを使用していない他の人々とコードを共有するという問題は指摘されていません。これは一つの命題です。重要なのは、Eclipse Caseを解決するためにMavenプロファイルを使用することです。

これは、あなたがpomの中でjunit5.versionプロパティを次のように定義したと仮定します。

<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が汚染されることはありません。

16
Aldian

続く Andrii Karaivanskyiの答え これが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>
6
Gerold Broser

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を明示的に必要としない限り)。

2
mahe

誰もがそれをIDEバグと知らせているので、私はEclipseSTSを試しました。どちらの場合も失敗しています。

回避策として、以下のようにpom.xmlファイルを修正することで修正しました。

これら2つのmaven依存関係junit-jupiter-enginejunit-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>

また、propertiesタグに両方のmaven依存関係のバージョンを追加してください。

<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>
2
Arvind Katte

新しいテストケースを作成した後も同じ問題が発生しました:Eclipse - > New - > JUnit Test Case。アクセスレベル修飾子なしでクラスを作成します。 classキーワードの前にpublicを追加するだけで問題を解決できます。

1
du-it

解決策のどれも助けにはならなかった:

問題はEclipse 2018-12がJUnit 5.3.1をサポートしていることです。それより前のバージョンで起動すると失敗します。

だから、あなたは少なくとも5.3.1を使うようにしてください。

5.4.0でも動きます。

あなたの親のpomがSpring Bootの場合は、(依存性管理において)junit-jupiter-apiが同じバージョンに設定されていることを確認する必要があります。必要ありませんjunit-platform-runnerまたは-launcher

1
T3rm1

参考までに、 "junit5を使用してテストが見つかりませんでした"という別の原因は、(誤ってまたは意図的に)テストケースを "非公開"と宣言していることです。

// Example of test case that doesn't get included
@Test
private void testSomeMethod() {
}

彼らは公開される必要があります。

1
Mike B

コードブロックをに投稿することは不可能なので comments これがJUnit 5を必要とするプロジェクトで私が使っているPOMテンプレートです。 。

<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を更新したい場合は、1か所でバージョンを更新するだけで済みます。また、プラットフォームのバージョン番号はPOMのどこにでも(互換性のあるバージョンで)表示される必要はありません、それはjunit-bomインポートによって自動的に管理されます。

1

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>
0
Luciano Ortiz

私はEclipseバージョンOxygen.3aリリース(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 - 概要

<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>
0
Harpreet Singh

私の場合、問題は私自身であり、EclipseのようなIDEはありませんでした。 JUnit 4 Testクラスをインポートしました。

だから、これをインポートしないでください:

import org.junit.Test  // JUnit 4

しかし、それをインポートしてください。

import org.junit.jupiter.api.Test // JUnit 5
0
armin.miedl