每当我运行我的项目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
我已经试过了
其中一些步骤can be found here,但最终问题仍然存在。
你遇到了已经修复的Eclipse bug 525948,它将在2018年3月21日即将发布的Oxygen.3(4。7。3)中发布。
解决方法是,将测试代码放在单独的项目中,并将测试中的项目添加到模块路径中,但不要将module-info.java
添加到测试项目中。使用您的项目,类和模块命名,它应该看起来像这样:
另见my video that shows Java 9 and JUnit 5 in Eclipse Oxygen.1a in action
在我的情况下,问题是我自己,没有像Eclipse这样的IDE。我已经导入了JUnit 4 Test类。
所以不要导入这个:
import org.junit.Test // JUnit 4
但DO导入那一个:
import org.junit.jupiter.api.Test // JUnit 5
创建一个新的TestCase后,我遇到了同样的问题:Eclipse - > New - > JUnit Test Case。它创建一个没有访问级别修饰符的类。我可以通过在class关键字之前放置一个公共来解决问题。
由于不可能将代码块发布到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
导入自动管理。
我在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>
加入你的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>
使用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>
我对STS 3.9.1也有同样的问题。然而,这似乎是一个Eclipse bug,为了解决这个问题,您可以在项目中添加测试依赖项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时看到此异常,我相信同样适用。
到目前为止,答案没有解决与不一定使用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”配置文件。
有了你就完成了。您的Eclipse将按预期运行Junit 5测试,但您添加的配置不会污染其他构建或其他IDE
以下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>
这些解决方案都没有帮助:
问题是Eclipse 2018-12支持JUnit 5.3.1。如果您在此之前使用版本启动它,它将失败。
所以请确保至少使用5.3.1。
5.4.0也有效。
如果您的父pom是Spring Boot,您需要确保(在依赖关系管理中)junit-jupiter-api设置为相同的版本。你不需要junit-platform-runner或-launcher!
使用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未发现测试”的另一个原因是(无意或有意)宣布测试用例为“私有”:
// Example of test case that doesn't get included
@Test
private void testSomeMethod() {
}
他们需要公开。
每个人都知道它的IDE错误,我尝试了Eclipse
和STS
。在这两种情况下,它都失败了。
作为一种解决方法,我通过修改pom.xml文件修复了如下。
我添加了这两个maven依赖项junit-jupiter-engine
和junit-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>