Eclipse没有使用NoClassDefFoundError引起的JUnit 5测试

Sha*_*gon 64 java eclipse junit java-9 junit5

问题

每当我运行我的项目JUnit测试(使用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
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试了什么

我已经试过了

  • 从构建路径中删除测试文件夹并再次添加.
  • 将鼠标悬停在使用@Test注释的方法上开始测试,然后单击"Run as JUnit Test".
  • 从Buildpath中删除JUnit并再次添加
  • 重启日食
  • 我还将项目整个项目从一台机器移动到另一台机器,并在那里使用提供的eclipse安装进行了尝试
  • 重命名测试方法.
  • 重新键入@Test注释

其中一些步骤可以在这里找到,但最终问题仍然存在.

And*_*kyi 53

我对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}"
}
Run Code Online (Sandbox Code Playgroud)

gradle.properties文件:

junit5MinorVersion=1.0
Run Code Online (Sandbox Code Playgroud)

如果您在使用IntelliJ IDEA时看到此异常,我相信同样适用.

  • 这是要进入<dependencies>的pom.xml片段:<dependency> <groupId> org.junit.jupiter </ groupId> <artifactId> junit-jupiter-engine </ artifactId> <version> 5.1.0 </ version> <scope> test </ scope> </ dependency> <dependency> <groupId> org.junit.platform </ groupId> <artifactId> junit-platform-launcher </ artifactId> <version> 1.1.0 </ version> < scope> test </ scope> </ dependency> (4认同)
  • @ user118967完美!谢谢.你通过大量失败的测试解决了我的问题! (3认同)
  • @PSatishPatro 添加上述内容后。您需要去运行该 Junit 测试用例的配置,然后转到 Classpath 选项卡 -&gt; 高级 -&gt; 添加库 -&gt; 确定 -&gt; Junit -&gt; 完成。然后继续运行它。这将在 Junit 执行期间添加库 (2认同)

str*_*tor 51

我通过右键单击测试并选择"运行配置"并将"测试运行器:"选项更改为"JUnit 4"来修复此问题,如下所示:

运行配置的屏幕截图

我再次运行测试,它工作正常.

  • 有趣的是,在使用JUnit5时在运行配置中选择“ JUnit4”。在处理一个大项目时,我不会说这是我可以依靠的一个好的解决方案。 (6认同)
  • 我也发现这个解决方案很可疑,它甚至没有解释为什么会这样,以及一个人可能会承担什么风险。 (2认同)

Jer*_*ney 26

简单修复:(添加 JUnit 5 库)

指示:

  • 右键单击项目-> 构建路径-> 配置构建路径
  • 在弹出窗口 -> 添加库 -> JUnit -> JUnit 5 -> 完成 -> 应用
  • 您应该会看到 JUnit 5 库(及其 jar)已添加到您的项目中
  • 右键单击项目 -> Maven -> 更新项目 -> 确定

  • 这应该被接受的答案,谢谢@JerryCarney (3认同)
  • 这对我有用。 (2认同)

Ald*_*ian 18

到目前为止,答案并没有解决与其他不一定使用Eclipse的人共享代码的问题.这是一个命题.关键是使用maven配置文件来解决Eclipse Case.

它假设您已经junit5.version在pom中定义了一个属性,如:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit5.version>5.1.1</junit5.version>
</properties>
Run Code Online (Sandbox Code Playgroud)

然后在该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>
Run Code Online (Sandbox Code Playgroud)

在此之后您需要做的就是在本地Eclipse中选择配置文件:右键单击您的项目并选择Maven > Select Maven Profiles...(或按Ctrl+ Alt+ P),然后检查我们刚刚创建的"eclipse"配置文件.

选择Maven简介

有了你就完成了.您的Eclipse将按预期运行Junit 5测试,但您添加的配置不会污染其他构建或其他IDE


how*_*ger 17

你遇到了已经修复的Eclipse bug 525948,它将在2018年3月21日即将发布的Oxygen.3(4.7.3)中发布.

解决方法是,将测试代码放在单独的项目中,并将测试中的项目添加到模块路径中,但不要将module-info.java测试项目添加到测试项目中.使用您的项目,类和模块命名,它应该看起来像这样:

在此输入图像描述

另请参阅我的视频,其中显示了Eclipse Oxygen.1a中的Java 9和JUnit 5

  • 我刚刚安装了Oxygen.3(4.7.3)并且问题仍然存在. (6认同)
  • @chomp如果您有2018-09,即使症状看起来相似,这也是一个不同的问题。如果未找到测试,则主要是由于不正确的类路径/模块路径(_Project&gt;属性:Java Build Path_)。 (2认同)
  • @howlger 谢谢。升级到最新版本后这个问题就消失了。再次感谢你的帮助 :)。 (2认同)

小智 15

使用 JUnit Jupiter (v.5.5.1) 添加这个 maven 依赖解决了这个问题。

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.5.1</version>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Ger*_*ica 8

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>
Run Code Online (Sandbox Code Playgroud)


arm*_*edl 8

就我而言,问题出在我自己,而不是像Eclipse这样的IDE。我已经导入了JUnit 4 Test类。

所以不要导入这个:

import org.junit.Test  // JUnit 4
Run Code Online (Sandbox Code Playgroud)

但是一定要导入其中一个:

import org.junit.jupiter.api.Test // JUnit 5
Run Code Online (Sandbox Code Playgroud)


小智 7

我也遇到了同样的问题,你只需要添加库,Junit 库已经与 Eclipse 一起提供,所以你只需要按照下面的操作

构建路径>配置构建路径>库>添加库>JUnit>下一步>完成

这个对我有用


T3r*_*rm1 6

这些解决方案都无济于事:

问题是Eclipse 2018-12支持JUnit 5.3.1。如果使用之前的版本启动,它将失败。

因此,请确保至少使用5.3.1。

5.4.0也可以。

如果您的父pom是Spring Boot,则需要(在依赖管理中)确保junit-jupiter-api设置为相同版本。您不需要junit-platform-runner或-launcher

  • 谢谢你的提示。我正在使用 2019-3 并添加了属性 `&lt;junit-jupiter.version&gt;5.4.1&lt;/junit-jupiter.version&gt;` 来覆盖 Spring boot (2.1.3.RELEASE) 中使用的版本。 (2认同)
  • 这是为我修复的。我删除了-launcher依赖项,它开始起作用。(蚀2019-09和junit 5.4.2) (2认同)

小智 6

从一开始,错误消息就告诉您找不到类: NoClassDefFoundError这意味着 junit 的 PATH 是问题所在。

  1. 按右键单击项目文件夹并选择属性或选择项目文件夹并按组合 cmd + i。

  2. 从列表“Java 构建路径”中选择。

  3. 选择“库”选项卡
  4. 如果将 JUnit 5(或 JUnit 4)添加到“Modulepath”,请选择“JUnit 5”并按 Remove。
  5. 选择“类路径”,按“添加库...”。
  6. 从打开的“添加库”窗口中,选择 JUnit,按下一步。
  7. 选择您需要的 JUnit 库版本,然后按完成。

就这些。尝试再次运行测试。


小智 6

代替:

import org.junit.Test;
Run Code Online (Sandbox Code Playgroud)

和:

import org.junit.jupiter.api.Test;
Run Code Online (Sandbox Code Playgroud)


小智 5

仅供参考,“未使用junit5找到测试”的另一个原因是(无意或有意)将测试用例声明为“私有”:

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

他们需要公开。


fat*_*hmi 5

我实际上使用 spring-tool-suite-4-4.5.1 并且当我想运行测试类时遇到了这个错误。解决方案是在库中添加“java构建路径”、“junit5”

在此处输入图片说明