Eclipse NoClassDefFoundError 导致 LauncherFactory 找不到使用 JUnit 5 的测试

Posted

技术标签:

【中文标题】Eclipse NoClassDefFoundError 导致 LauncherFactory 找不到使用 JUnit 5 的测试【英文标题】:Eclipse No tests found using JUnit 5 caused by NoClassDefFoundError for LauncherFactory 【发布时间】:2018-03-24 20:50:42 【问题描述】:

问题

每当我运行我的项目 JUnit 测试(使用 JUnit 5 和 Java 9 和 Eclipse Oxygen 1.a)时,我都会遇到 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

到目前为止我尝试了什么

我已经试过了

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

其中一些步骤can be found here,但最终问题仍然存在。

【问题讨论】:

但是您是否尝试找出答案中所述的差异 -***.com/questions/34413/…? 【参考方案1】:

将其更改为 JUnit 4 及其作品。请试一试(如果你有简单的例子,那么确定试试这个。)点击那个类文件——>它将出现运行/调试设置——>点击新的——>选择JUnit——>点击确定—— > 将 TestRunner 更改为 Junit 4。然后单击应用并确定。然后运行它肯定会工作。

【讨论】:

【参考方案2】:

我实际上使用的是 spring-tool-suite-4-4.5.1,当我想运行一个测试类时我遇到了这个错误。 解决方案是在库中添加“java build path”、“junit5”

【讨论】:

我最初使用了这个解决方案并且它有效,然后我阅读了其他答案,我发现“正确”的答案是@armin.miedl's。我从构建路径中删除了 JUnit 5 库,并将 Test 注释导入替换为正确的。【参考方案3】:

我痛苦地一一检查现有的答案,但没有一个适用于我,也没有一个为我解决。

就我而言,在项目属性和源选项卡下,我已将测试文件夹添加为源路径。此条目下有一个子属性,显示为Output Folder。我将其设置为我希望生成测试类文件的位置,并将它们保存在此位置。

但是,JUnit 5 是 Jupiter 5.7.0 版本(这是 eclipse 附带的版本,而不是我添加到我的项目中的单独的 mvn 依赖项),当运行实际上是在一个 不同的 比我指定的文件夹,这是target/test-classes。如果我手动将我的类文件从我指定的Output Folder 文件夹移动到target/test-classes 文件夹,那么我的单元测试将运行。

因此,请确保您的类文件位于运行时认为它们应该位于的位置。

【讨论】:

【参考方案4】:

@Test 注解必须从 org.junit.jupiter.api.Test 导入,这样 Junit5 才能读取它。 Junit4 使用从 org.junit.Test 包导入的@Test 注解。

【讨论】:

【参考方案5】:

将 Java 项目转换为 Maven 项目为我解决了这个问题。通过以下方式在 Eclipse 上完成转换:右键单击项目 -> 配置 -> 转换为 Maven 项目

【讨论】:

【参考方案6】:

您应该确保您的测试用例函数是公开的而不是私有的,以便测试运行程序可以访问它。

@Test
private void testmethod()

@Test
public void testmethod()

【讨论】:

【参考方案7】:

替换:

import org.junit.Test;

与:

import org.junit.jupiter.api.Test;

【讨论】:

【参考方案8】:

删除 JUnit 库,然后再次添加它为我解决了这个问题。

【讨论】:

【参考方案9】:

您可能从org.junit.Test 导入@Test,这是一个JUnit 4 注释。 Junit5 测试运行器不会发现它。

Junit5 测试运行器将发现一个带有 org.junit.jupiter.api.Test 注释的测试

从Import org.junit.Test throws error as "No Test found with Test Runner "JUnit 5""找到答案

【讨论】:

【参考方案10】:

我在 SpringBoot 项目中遇到了同样的问题,就我而言,原因是输出文件夹“/target/test-classes”为空。

在.classpath文件中手动修复,寻找属性为“test”的classpathentry并更改输出属性的内容:

从这里:

<classpathentry kind="src" output="<project folder>/target/test-classes" path="src/test/java">
    <attributes>
        <attribute name="test" value="true"/>
        <attribute name="optional" value="true"/>
        <attribute name="maven.pomderived" value="true"/>
    </attributes>
</classpathentry>

到这里:

<classpathentry kind="src" output="target/test-classes" path="src/test/java">
    <attributes>
        <attribute name="test" value="true"/>
        <attribute name="optional" value="true"/>
        <attribute name="maven.pomderived" value="true"/>
    </attributes>
</classpathentry>

【讨论】:

【参考方案11】:

将 org.junit.platform 添加到您的 pom 并构建它。接下来,您需要进入 TEST FILE 的“运行配置”并在类路径中添加 JUNIT,APPLY->RUN 将解决问题。

【讨论】:

【参考方案12】:

我遇到了类似的问题。这是由于属性中的源路径不正确。 打开项目属性 -> Java 构建路径 -> 源。如果是您的情况,请删除不正确的路径

【讨论】:

【参考方案13】:

尝试将您的单元测试配置重新配置为项目 JRE。

【讨论】:

【参考方案14】:

在使用 Spring Boot api 实现 Mockito 时发生此问题。下面在 gradle 文件中添加以下依赖项

compile group: 'org.mockito', name: 'mockito-core', version: '2.22.0'

注意:Spring boot 2.2.0版本

【讨论】:

【参考方案15】:

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

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

对我有用

【讨论】:

它在 Eclipse 中运行良好。版本:2020-06 (4.16.0) 版本号:20200615-1200【参考方案16】:

我复制了一些代码并创建了一个 TC。基本上将普通的 java 类转换为 JUnit TC。 我是gettgig错误。 后来我从 New -> Junit TC 创建了一个新的 JUnit 类。复制了相同的代码。它工作正常并且错误消失了。

【讨论】:

【参考方案17】:

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

说明:

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

【讨论】:

GRADLE FIX: (Add JUnit 5 Library) INSTRUCTIONS: * 右击项目 -> 构建路径 -> 配置构建路径 * 在弹出窗口中 -> 添加库 -> JUnit -> JUnit 5 -> 完成 -> 应用 * 你应该看到 JUnit 5 库(及其 jars)添加到你的项目 * 右键单击​​项目 -> Gradle -> 刷新 Gradle 项目 * 右键单击​​项目 -> 运行方式 -> Junit Test 这应该被接受,谢谢@JerryCarney【参考方案18】:

您缺少具有组的 JUnit 5 平台启动器:'org.junit.platform',名称:'junit-platform-launcher'

只需添加你的 POM:

<dependency>
       <groupId>org.junit.platform</groupId>
       <artifactId>junit-platform-launcher</artifactId>
    </dependency>

【讨论】:

【参考方案19】:

你应该知道:

来自 junit4

@Before 与 @Test 一起使用:“import org.junit.Test

@BeforeEach 来自 Junit5 与:“import org.junit.jupiter.api.Test

所以请确保您使用的是来自同一版本 Junit 的导入,否则我猜它不会工作。

【讨论】:

【参考方案20】:

当我将我的 jupiter api 版本更改为最新版本时,它得到了解决。同时,我的 Eclipse 和其他 Eclipse 扩展 IDE(例如 STS)出现构建路径错误。对于每次 maven 更新,ide 都会强制我设置 JRE 系统库。

【讨论】:

【参考方案21】:

可能是junit-platform-launcher/junit-platform-runner的版本造成的。

1.1.0不起作用

1.4.1 适用于我的设置。

我认为这是 eclipse 中的一个错误,因为它正在使用更高版本的 junit 库而不是其他版本。

这解决了我的问题。另一个解决方案对我来说似乎不太可行或风险。 谢谢。

【讨论】:

【参考方案22】:

我也遇到了 Eclipse(版本:2019-12 (4.14.0))的这个问题。该解决方案似乎要么使用 IntelliJ,要么使用 Maven 测试在 Eclipse 中运行此类测试。

【讨论】:

【参考方案23】:

刚刚通过 Eclipse 菜单添加了我的 Test.class 并开始工作。 右键项目->新建->其他->JUnit->JUnit测试用例

【讨论】:

【参考方案24】:

我正在使用:

弹簧工具套件 4 版本:4.4.2.RELEASE 内部版本号:201911201053 Java版本:1.8.0_191

并且显示的消息是 没有找到测试运行器“JUnit5”的测试

对我有用的是下面的配置

    <properties>
        <java.version>1.8</java.version>
        <junit-jupiter.version>5.5.2</junit-jupiter.version>
        <junit-platform.version>1.5.2</junit-platform.version>
    </properties> 

    <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>

【讨论】:

【参考方案25】:

我遇到了同样的错误,在我的情况下,只需转到 Project Properties &gt; Maven &gt; Update project 和/或清理和重建项目。

【讨论】:

【参考方案26】:

对我来说,我配置了构建路径以添加 JUnit 5 库并添加依赖项

     <dependency> 
        <groupId>org.junit.platform</groupId> 
        <artifactId>junit-platform-launcher</artifactId> 
        <version>1.1.0</version> 
        <scope>test</scope> 
     </dependency>

分开。

【讨论】:

【参考方案27】:

你应该改变

@Test
public static void testmethod()

@Test
public void testmethod()

@Test 不支持静态方法

【讨论】:

【参考方案28】:

您只能使用junit-jupiter 作为测试依赖项,而不是junit-jupiter-apijunit-platform-launcherjunit-jupiter-engine

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.5.2</version>
    <scope>test</scope>
</dependency>

【讨论】:

此解决方案适用于 JUnit 5.6.2、Java 11(和 eclipse 2020-03/4.15.0)【参考方案29】:

我正在使用 Eclipse 2019-09。

我必须将 junit-bom 版本更新到至少 5.4.0。我以前有 5.3.1,这导致了 OP 的相同症状。

我现在的配置是:

    <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>

【讨论】:

另一种选择是将 5.4.0 添加到 pom 属性中【参考方案30】:

在Andrii Karaivanskyi's answer 之后是 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>

更新

根据Alexander Wessel 的评论,您可以按照his answer 中的说明使用org.junit:junit-bom 来提问Eclipse No tests found using JUnit 5 caused by NoClassDefFoundError for LauncherFactory。

【讨论】:

不要声明 jupiter 和平台版本的属性,use the BOM instead。基本上使用scope=import type=pom在dependencyManagement标签中添加对BOM的依赖,然后在测试范围内将依赖添加到junit-platform-launcher和junit-jupiter-engine,在依赖部分不提供版本 . BOM 将始终确保您在类路径中只有一个版本的 JUnit Platform 和 Jupiter,并且各个版本都是预期的版本(例如 5.2.0 和 1.2.0)。 @AlexanderWessel 我没有 BOM。这只是一个示例摘录,无论它在哪里,都必须使用 Maven 声明依赖项。 这不是您有(或者更确切地说是您的项目有)BOM 本身。我在解释,通过导入 JUnit 5 提供的BOM ,您可以确保Junit Jupiter 和Junit Platform 版本兼容,并且您不需要声明版本在各个依赖项中,因此也不再需要声明版本属性。需要明确的是:您的示例 确实 工作正常。但是导入 JUnit BOM 更优雅一些(在我看来),并且在某些情况下更安全。 Here's my answer showing the imported BOM approach verbatim.

以上是关于Eclipse NoClassDefFoundError 导致 LauncherFactory 找不到使用 JUnit 5 的测试的主要内容,如果未能解决你的问题,请参考以下文章

selenium-网站demo学习- java.lang.IllegalAccessError ,java.lang.NoClassDefFoundError,还有没找到driver的

带命名空间的XML的dom4j应用<转>

eclipse中如何设置启动参数

如何修改eclipse.ini

eclipse卡在48%

IDEA 导入eclipse project 找不到 eclipse