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

问题描述 投票:51回答:14

问题

每当我运行我的项目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注释的方法上开始测试,然后单击“Run as JUnit Test”。
  • 从Buildpath中删除JUnit并再次添加
  • 重启日食
  • 我还将项目整个项目从一台机器移动到另一台机器,并在那里使用提供的eclipse安装进行了尝试
  • 重命名测试方法。
  • 重新键入@Test注释

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

java eclipse junit java-9 junit5
14个回答
17
投票

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

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

enter image description here

另见my video that shows Java 9 and JUnit 5 in Eclipse Oxygen.1a in action


2
投票

在我的情况下,问题是我自己,没有像Eclipse这样的IDE。我已经导入了JUnit 4 Test类。

所以不要导入这个:

import org.junit.Test  // JUnit 4

但DO导入那一个:

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

1
投票

创建一个新的TestCase后,我遇到了同样的问题:Eclipse - > New - > JUnit Test Case。它创建一个没有访问级别修饰符的类。我可以通过在class关键字之前放置一个公共来解决问题。


1
投票

由于不可能将代码块发布到comments这里是我在需要JUnit 5的项目中使用的POM模板。这允许在Eclipse中构建和“运行为JUnit测试”并使用普通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导入自动管理。


0
投票

我在eclipse版本Oxygen.3a Release(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-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>


0
投票

加入你的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>

0
投票

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

48
投票

我对STS 3.9.1也有同样的问题。然而,这似乎是一个Eclipse bug,为了解决这个问题,您可以在项目中添加测试依赖项junit-platform-launcherhttps://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时看到此异常,我相信同样适用。


37
投票

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

Screenshot of run configruations

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


18
投票

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

它假设你已经在你的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”配置文件。

Selection Of Maven Profile

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


6
投票

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

3
投票

这些解决方案都没有帮助:

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

所以请确保至少使用5.3.1。

5.4.0也有效。

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


2
投票

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


2
投票

仅供参考,“使用junit5未发现测试”的另一个原因是(无意或有意)宣布测试用例为“私有”:

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

他们需要公开。


2
投票

每个人都知道它的IDE错误,我尝试了EclipseSTS。在这两种情况下,它都失败了。

作为一种解决方法,我通过修改pom.xml文件修复了如下。

我添加了这两个maven依赖项junit-jupiter-enginejunit-platform-launcher

pom.hml

<!-- 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>
© www.soinside.com 2019 - 2024. All rights reserved.