Maven+Kotlin项目JUnit5测试报错:TestEngine 'junit-jupiter'无法发现测试
Maven+Kotlin项目JUnit5测试报错:TestEngine with ID 'junit-jupiter' failed to discover tests
错误详情
运行JUnit5测试时触发以下错误:
TestEngine with ID 'junit-jupiter' failed to discover tests
完整错误堆栈:
org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:189) at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:168) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: java.lang.NoClassDefFoundError: org/junit/jupiter/api/ClassOrderer at org.junit.jupiter.engine.config.DefaultJupiterConfiguration.<clinit>(DefaultJupiterConfiguration.java:50) at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:66) at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:181) ... 8 more Caused by: java.lang.ClassNotFoundException: org.junit.jupiter.api.ClassOrderer at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 11 more
环境信息
- JUnit Jupiter Engine版本:5.8.2(已尝试5.9.0等版本)
- Maven Surefire Plugin版本:2.22.2
- IDE:IntelliJ Community Edition 2023.1.3
- 项目类型:Maven+Kotlin
问题根源
从堆栈信息看,核心问题是ClassNotFoundException: org.junit.jupiter.api.ClassOrderer,该类属于JUnit Jupiter API模块,引发原因包括:
- Kotlin测试依赖与JUnit版本不兼容
- pom.xml中存在重复依赖,导致Maven依赖解析异常
- Surefire插件版本过旧,无法适配新版本JUnit5
解决方案
1. 清理重复依赖
移除pom.xml中重复的kotlin-stdlib-jdk8依赖,仅保留使用${kotlin.version}变量的版本。
2. 统一依赖版本
确保kotlin-test-junit5版本与项目kotlin.version一致,避免版本冲突;同时统一JUnit5版本,使用聚合依赖简化配置。
3. 更新Surefire插件版本
将maven-surefire-plugin和maven-failsafe-plugin升级到3.0.0及以上版本,更好支持JUnit5。
修正后的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" 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> <artifactId>Airline</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>consoleApp</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <kotlin.code.style>official</kotlin.code.style> <kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget> <kotlin.version>1.9.0</kotlin.version> <junit-jupiter.version>5.9.2</junit-jupiter.version> <maven-surefire.version>3.1.2</maven-surefire.version> </properties> <repositories> <repository> <id>mavenCentral</id> <url>https://repo1.maven.org/maven2/</url> </repository> </repositories> <build> <sourceDirectory>src/main/kotlin</sourceDirectory> <testSourceDirectory>src/test/kotlin</testSourceDirectory> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <source>src/main/kotlin</source> <source>target/generated-sources/annotations</source> </sourceDirs> </configuration> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> <configuration> <sourceDirs> <source>src/test/kotlin</source> <source>target/generated-test-sources/test-annotations</source> </sourceDirs> </configuration> </execution> </executions> <configuration> <jvmTarget>1.8</jvmTarget> </configuration> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire.version}</version> </plugin> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>${maven-surefire.version}</version> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <configuration> <mainClass>MainKt</mainClass> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-test-junit5</artifactId> <version>${kotlin.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit-jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jdk8</artifactId> <version>${kotlin.version}</version> </dependency> </dependencies> </project>
后续操作
- 替换pom.xml为修正后的内容
- 执行Maven命令清理并重新下载依赖:
mvn clean install -DskipTests
- 在IntelliJ中刷新Maven依赖(点击右侧Maven面板的刷新图标)
- 重新运行测试
内容的提问来源于stack exchange,提问作者Harsh Agarwal
相关产品推荐
相关产品推荐

