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

问题

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

到目前为止我尝试了什么

我已经试过了

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

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

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

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

在此处输入图像描述

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

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

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

运行配置的屏幕截图

我再次运行测试并且工作正常。

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

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

  UTF-8 5.1.1  

然后在profiles部分添加以下内容:

   eclipse   org.junit.jupiter junit-jupiter-engine   org.junit.platform junit-platform-launcher      org.junit.jupiter junit-jupiter-engine ${junit5.version} test   org.junit.platform junit-platform-launcher 1.1.1 test      

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

选择Maven简介

随之而来的就是你。 您的Eclipse将按预期运行Junit 5测试,但您添加的配置不会污染其他构建或其他IDE

使用STS 3.9.1我遇到了同样的问题。 但是,目前我不需要任何新的JUnit5function,所以我试图强制使用旧版本。 如果使用maven,您可以将以下依赖项添加到pom.xml:

  org.junit.platform junit-platform-launcher ${junit.platform.version} test   org.junit.jupiter junit-jupiter-engine ${junit.jupiter.version} test   org.junit.vintage junit-vintage-engine ${junit.vintage.version} test  

这对我来说很有用(至少只要我不明确需要JUnit5)。

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

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

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

他们需要公开。

继Andrii Karaivanskyi的回答之后是Maven POM宣言:

  ... 5.2.0 1.2.0 ...   ...  org.junit.jupiter junit-jupiter-engine ${junit.jupiter-version} test   org.junit.platform junit-platform-launcher ${junit.platform-version} test  ...  

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

  UTF-8 1.8 5.1.1 1.1.1     maven-compiler-plugin 3.1  ${java.version} ${java.version}       org.junit.jupiter junit-jupiter-engine ${junit.jupiter.version}   org.junit.platform junit-platform-runner ${junit.platform.version} test