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 > Maven > 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-api
、junit-platform-launcher
、junit-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>
【讨论】:
另一种选择是将在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的