JUnit 5无法识别测试类求助:NoClassDefFoundError异常
JUnit 5测试无法被Maven识别,报NoClassDefFoundError
执行mvn clean install时出现以下异常,导致项目中800多个测试类无法被识别:
sept. 07, 2023 3:57:06 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable WARNING: TestEngine with ID 'junit-jupiter' failed to discover tests java.lang.NoClassDefFoundError: org/junit/platform/engine/support/discovery/SelectorResolver at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:69) at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:168) at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:155) at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:120) at org.apache.maven.surefire.junitplatform.TestPlanScannerFilter.accept(TestPlanScannerFilter.java:56) at org.apache.maven.surefire.util.DefaultScanResult.applyFilter(DefaultScanResult.java:102) at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.scanClasspath(JUnitPlatformProvider.java:143) at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:124) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345) at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418) Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.support.discovery.SelectorResolver at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 12 more
当前pom.xml中的JUnit依赖和Surefire插件配置:
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.10.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.10.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.10.0</version> <scope>test</scope> </dependency> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin>
测试类命名和注解规范示例:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class AttestationIdentiteCallParamsTest { @Test void testAttestationIdentiteCallParams() { }
已在IntelliJ和CMD中使用Java 11执行测试,多次运行mvn clean install无效,以下是解决思路:
- 升级Maven Surefire插件版本:JUnit 5.10.0引入了
SelectorResolver类,而2.22.2版本的Surefire插件不兼容这个新类。将插件版本升级到3.2.0或更高:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.0</version> </plugin> - 简化JUnit依赖配置:使用
junit-jupiter聚合依赖替代单独引入api、engine、params,确保版本统一且依赖完整:<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.10.0</version> <scope>test</scope> </dependency> - 强制更新Maven依赖:执行
mvn clean install -U,强制更新本地仓库中的依赖,避免缓存的旧版本jar包导致冲突。 - 检查依赖冲突:使用
mvn dependency:tree命令查看依赖树,确认是否有其他依赖引入了旧版本的JUnit平台组件,如有需要排除冲突依赖。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

