Eclipse没有使用由NoClassDefFoundError引起的JUnit 5的测试
问题
每当我运行我的项目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.(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-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时看到此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”配置文件我们刚刚创建。
随之而来的就是你。 您的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