Eclipse没有发现由NoClassDefFoundError为LauncherFactory使用JUnit 5进行的测试


99

问题

每当我运行项目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

到目前为止我尝试过的

我已经尝试过了

  • 从构建路径中删除测试文件夹,然后再次添加。
  • 通过将鼠标悬停在带有@Test注释的方法上来启动测试,然后单击“以JUnit Test身份运行”。
  • 从Buildpath中删除JUnit并再次添加
  • 重新开始蚀
  • 我也将整个项目从一台机器移到另一台机器,并使用提供的Eclipse安装进行了尝试。
  • 重命名测试方法。
  • 重新输入@Test批注

这些步骤中的一些可以在此处找到,但最终问题仍然存在。


但是,您是否尝试找出答案中所述的区别-stackoverflow.com/questions/34413/…
纳曼

Answers:


22

您遇到了已修复的Eclipse错误525948,它将在即将于2018年3月21日发布的Oxygen.3(4.7.3)版本中发布。

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

在此处输入图片说明

另请参阅我的视频,该视频演示了运行中的Eclipse Oxygen.1a中的Java 9和JUnit 5


1
@nullpointer我的意思是创建一个新的非模块化Java项目(没有module-info.java)。在Eclipse中,Java项目只有一个输出文件夹,因此它只能包含一个或不包含任何一个module-info.java。但是,即使项目不是模块化的(也没有module-info.java),也可以将模块添加到项目的modulepath中。
咆哮者

1
@ShadowDragon该hack的缺点是我们需要为测试类使用不同的软件包名称,因此无法进行软件包专用测试
kleopatra

7
我刚刚安装了Oxygen.3(4.7.3),问题仍然存在。
user118967

2
@chomp如果您有2018-09,即使症状看起来相似,这也是一个不同的问题。如果未找到测试,则主要是由于不正确的类路径/模块路径(“项目”>“属性:Java构建路径”)。
howlger

2
@howlger谢谢。升级到最新版本后,此问题消失了。再次感谢你的帮助 :)。
达塔

136

我通过右键单击测试并选择“运行配置”,然后将“测试运行器:”选择更改为“ JUnit 4”来解决此问题,如下所示:

运行配置的屏幕截图

我再次运行了测试,它成功了。


13
有趣的是,在使用JUnit5时在运行配置中选择“ JUnit4”。在处理一个大型项目时,我不会称其为我可以依靠的一个好的解决方案。
Levent Divilioglu

2
我还发现这种解决方案是可疑的,甚至没有解释为什么这种解决方案有效以及可能承担的风险。
阿玛丹

如果这样做不能为您解决问题,请转到同一窗口上的classpath选项卡,然后将JUnit添加到Bootstrap库中。
阿比(Abhi)

谢谢; 选择JUnit 4解决了我的问题。目前,这是解决问题的最简单方法。
Tes

我认为这种侵入性较小的解决方案,即无需修改源代码。
拉斐尔·罗沙

65

我对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时看到此异常,我相信同样适用。


1
如果使用gradle通常会转到build.gradle。如果您正在使用Maven,则为pom.xml。尽管Maven的格式有所不同。
Andrii Karaivanskyi

1
这为我解决了。谢谢!
克里斯(Chris)

4
这是放在<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>
user118967

1
仍然添加junit-platform 1.1.0对我不起作用。它显示了相同的消息“使用JUnit 5的测试运行程序未找到测试””
P Satish Patro

2
@PSatishPatro添加以上内容之后。您需要运行该Junit测试用例的配置,然后转到Classpath选项卡-> Advanced-> Add Library-> OK-> Junit-> Finish。然后继续运行。这将在Junit
Jaison Varghese

28

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

所以不要导入这个:

import org.junit.Test  // JUnit 4

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

import org.junit.jupiter.api.Test // JUnit 5

我之所以在JUnit 4和5之间切换是因为当前项目正在使用JUnit 5,但是当向Hibernate等报告错误时,我需要切换至JUnit4。最终我不小心混入了导入内容。♂‍♂️
Kawu

21

到目前为止,答案还没有解决与不必使用Eclipse的其他人共享代码的问题。这是一个主张。关键是使用Maven概要文件来解决Eclipse Case。

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

<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”配置文件。

Maven配置文件的选择

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


14

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

我有一个为Spring Boot 2.x创建的JAR项目,该项目引入了JUnit5。我添加了此依赖关系,它似乎已解决了该问题。谢谢!
David Bradley

14

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

说明:

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

9

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

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

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

5.4.0也可以。

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


2
谢谢你的提示。我正在使用2019-3,并且添加了属性<junit-jupiter.version>5.4.1</junit-jupiter.version>以覆盖Spring Boot(2.1.3.RELEASE)中使用的版本。
Ritesh

3
这是为我修复的。我删除了-launcher依赖项,它开始起作用。(eclipse 2019-09和junit 5.4.2)
Raymond

该解决方案也对我有效。但是,就我而言,我从5.3.1更改为5.5.1,将junit-platform-engine更改为1.5.1。
Arwan Khoiruddin

1
这为我解决了。在eclipse 2020-03中,测试不是从junit版本5.5.2开始,而是从5.6.0开始。作为您答案的一般更新:可能至少需要使用eclipse使用的junit版本。
拉尔斯·布里姆

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>

更新

根据Alexander Wessel的评论,您可以使用org.junit:junit-bom,如Eclipse问题的回答中所述。没有发现使用JUnit 5的NoClassDefFoundError为LauncherFactory造成测试


1
不要声明木星和平台版本的属性,请改为使用BOM。基本上,使用来在dependencyManagement标记中添加对BOM的依赖关系scope=import type=pom,然后在测试范围中将依赖项添加到junit-platform-launcher和junit-jupiter-engine,而不在依赖项部分中提供版本。BOM将始终确保在类路径上只有JUnit Platform和Jupiter的一个版本,并且相应的版本是预期的版本(例如5.2.0和1.2.0)。
亚历山大·韦塞尔

@AlexanderWessel我没有BOM。这只是一个示例摘录,无论它在哪里,都必须使用Maven声明依赖项。
Gerold Broser

1
您本身是否拥有BOM(或您的项目是否拥有BOM)。我在解释说,通过导入JUnit 5提供的BOM 可以确保Junit Jupiter和Junit Platform版本兼容,并且不需要在各个依赖项中声明版本,因此也不再需要声明版本。属性。需要说明的是:您的示例确实可以正常工作。但是导入JUnit BOM更加优雅(以我的愚见),并且在某些情况下更安全。
亚历山大·韦塞尔


7

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

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

他们需要公开。


7

我还遇到了您只需要添加库的相同问题,Junit库已经与Eclipse一起提供,因此您只需遵循以下步骤

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

这个对我有用


在日食中效果很好。版本:2020-06(4.16.0)内部版本号:20200615-1200
OJVM


4

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

  1. 按右键单击项目文件夹,然后选择“属性”,或者选择项目文件夹,然后按cmd + i组合键。

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

  3. 选择“库”标签
  4. 如果将JUnit 5(或JUnit 4)添加到“模块路径”,则选择“ JUnit 5”并按Remove。
  5. 选择“类路径”,然后按“添加库...”。
  6. 从打开的“添加库”窗口中,选择JUnit,然后按下一步。
  7. 选择所需的JUnit库版本,然后按Finish。

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


4

你应该知道 :

@Beforejunit4去与@Test: “进口org.junit.Test

@BeforeEachJunit5去与“进口org.junit.jupiter.api.Test

因此,请确保您使用的是从同一版本的Junit导入的内容,否则我猜它无法正常工作。


3

使用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)。


如果使用的是JUnit5,为什么还要添加“ org.junit.vintage”?它仅用于向后兼容(例如使用旧的JUnit)AFAIK。
Levent Divilioglu

因为在该项目和STS 3.9.1中,我无法/不能使用JUnit5,而不能使用JUnit4。
mahe

3

所有人都知道这是IDE错误,因此我尝试了EclipseSTS。在这两种情况下,它都将失败。

作为一种解决方法,我已通过修改pom.xml文件(如下所示)进行了修复。

我添加了这两个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>

另外,请确保在属性标签中添加两个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>

1
添加junit-platform-launcher依赖关系为我解决了这个问题。谢谢
Venkatesh Manohar

3

我正在使用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>

另一个选择是将<junit-jupiter.version> 5.4.0 </junit-jupiter.version>添加到pom属性中
Uri Loya

2

由于不可能将代码块发布到注释中,因此这是我在需要JUnit 5的项目中使用的POM模板。这允许在Eclipse中构建和“以JUnit Test运行”,并使用纯Maven构建项目。

<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,只需要将其更新到一个位置。此外,平台版本号不需要在POM中的任何位置出现(兼容版本),它是通过junit-bom导入自动管理的。


2

我正在使用:

Spring Tool Suite 4版本:4.4.2.RELEASE构建ID: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>

2

您缺少以下组的JUnit 5 Platform Launcher,其组为:'org.junit.platform',名称为:'junit-platform-launcher'

只需添加您的POM:

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

1

我在Eclipse版本Oxygen.3a Release(4.7.3a)中遇到相同的错误。Maven Dependencies不匹配存在问题。要解决,我用以下依赖项更新了Pom.xml。

http://maven.apache.org/xsd/maven-4.0.0.xsd“> 4.0.0 com.netapp.junitnmactiopractice JunitAndMactioPractice 0.0.1-SNAPSHOT

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


您是否看过《 JUnit 5用户指南》有关junit-platform-runner:“在JUnit 4环境中在JUnit平台上执行测试和测试套件的运行程序。
Gerold Broser,

1

你可以只用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>

1
此解决方案适用于JUnit 5.6.2,Java 11(和Eclipse 2020-03 / 4.15.0)
coseos

1

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

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

分开。


1

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



1

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

在此处输入图片说明


0

你应该改变

@Test
public static void testmethod(){}

@Test
public void testmethod(){}

@Test不支持静态方法


0

我遇到了同样的错误,就我而言,这是转到Project Properties > Maven > Update project和/或清理并重建项目的简单问题。


0

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


0

这可能是由于junit-platform-launcher / junit-platform-runner的版本引起的。

1.1.0不起作用

1.4.1适用于我的设置。

我认为这是eclipse中的错误,因为它可以与junit的更高版本库一起使用,而不是与其他版本一起使用。

这解决了我的问题。另一项决议对我来说似乎不太可行或没有风险。谢谢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.