私のプロジェクトのJUnitテスト(Java 9とEclipse Oxygen 1.aでJUnit 5を使用)を実行するたびに、Eclipseがテストを見つけることができないという問題に遭遇します。
実行設定の下で、Eclipseは@Testでアノテーションが付けられたメソッドさえ見つけることができませんが、代わりに私に "(全てのメソッド)"を表示するだけです。次の図は、うまくいけば私の設定をよく見ることができます。
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
私はすでに試した
これらのステップのいくつか ここで見つけることができます 、しかし結局問題は残りました。
あなたは Eclipse bug 525948 に遭遇しました。これはすでに修正されていて、次のリリースで公開されるでしょうOxygen.3(4.7) .3)、2018年3月21日。
回避策として、テストコードを別のプロジェクトに配置し、テスト対象のプロジェクトをモジュールパスに追加します。ただし、module-info.Java
をテストプロジェクトに追加しないでください。プロジェクト、クラス、およびモジュールの命名では、次のようになります。
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の使用中にこの例外が発生した場合も同様です。
これまでの回答では、必ずしも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"プロファイルを確認します。
これで完了です。 Eclipseは期待どおりJunit 5テストを実行しますが、追加した設定によって他のビルドや他のIDEが汚染されることはありません。
続く 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>
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を明示的に必要としない限り)。
誰もがそれをIDEバグと知らせているので、私はEclipse
とSTS
を試しました。どちらの場合も失敗しています。
回避策として、以下のようにpom.xmlファイルを修正することで修正しました。
これら2つの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>
また、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>
新しいテストケースを作成した後も同じ問題が発生しました:Eclipse - > New - > JUnit Test Case。アクセスレベル修飾子なしでクラスを作成します。 classキーワードの前にpublicを追加するだけで問題を解決できます。
解決策のどれも助けにはならなかった:
問題はEclipse 2018-12がJUnit 5.3.1をサポートしていることです。それより前のバージョンで起動すると失敗します。
だから、あなたは少なくとも5.3.1を使うようにしてください。
5.4.0でも動きます。
あなたの親のpomがSpring Bootの場合は、(依存性管理において)junit-jupiter-apiが同じバージョンに設定されていることを確認する必要があります。必要ありませんjunit-platform-runnerまたは-launcher!
参考までに、 "junit5を使用してテストが見つかりませんでした"という別の原因は、(誤ってまたは意図的に)テストケースを "非公開"と宣言していることです。
// Example of test case that doesn't get included
@Test
private void testSomeMethod() {
}
彼らは公開される必要があります。
コードブロックをに投稿することは不可能なので 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
インポートによって自動的に管理されます。
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>
私は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>
私の場合、問題は私自身であり、EclipseのようなIDEはありませんでした。 JUnit 4 Testクラスをインポートしました。
だから、これをインポートしないでください:
import org.junit.Test // JUnit 4
しかし、それをインポートしてください。
import org.junit.jupiter.api.Test // JUnit 5