JUnit5+Maven执行测试时maven-surefire-plugin缺失类报错求助
问题描述
执行命令 mvn clean -Dtest=SuiteTest test 运行JUnit5测试套件时,maven-surefire-plugin:3.0.0-M7 抛出 org.apache.maven.surefire.api.testset.TestSetFailedException 类缺失错误,相关错误日志和POM配置如下,求解决方案。
错误日志
[INFO] Scanning for projects... [INFO] [INFO] -----------------------< OpbuAppium:OpbuAppium >------------------------ [INFO] Building OpbuAppium 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ OpbuAppium --- [INFO] Deleting /Users/andreygordienko/AutoMobile/msb_bpmobile/target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ OpbuAppium --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/andreygordienko/AutoMobile/msb_bpmobile/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.10.0:compile (default-compile) @ OpbuAppium --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 202 source files to /Users/andreygordienko/AutoMobile/msb_bpmobile/target/classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ OpbuAppium --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 2 resources [INFO] [INFO] --- maven-compiler-plugin:3.10.0:testCompile (default-testCompile) @ OpbuAppium --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 25 source files to /Users/andreygordienko/AutoMobile/msb_bpmobile/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:3.0.0-M7:test (default-test) @ OpbuAppium --- [WARNING] Error injecting: org.apache.maven.plugin.surefire.SurefirePlugin java.lang.NoClassDefFoundError: org/apache/maven/surefire/api/testset/TestSetFailedException at java.lang.Class.getDeclaredConstructors0 (Native Method) at java.lang.Class.privateGetDeclaredConstructors (Class.java:2671) ... Caused by: java.lang.ClassNotFoundException: org.apache.maven.surefire.api.testset.TestSetFailedException at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass (SelfFirstStrategy.java:50) at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass (ClassRealm.java:271) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass (ClassRealm.java:247) at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass (ClassRealm.java:239) at java.lang.Class.getDeclaredConstructors0 (Native Method) at java.lang.Class.privateGetDeclaredConstructors (Class.java:2671) at java.lang.Class.getDeclaredConstructors (Class.java:2020) at com.google.inject.spi.InjectionPoint.forConstructorOf (InjectionPoint.java:245) at com.google.inject.internal.ConstructorBindingImpl.create (ConstructorBindingImpl.java:115) at com.google.inject.internal.InjectorImpl.createUninitializedBinding (InjectorImpl.java:706) at com.google.inject.internal.InjectorImpl.createJustInTimeBinding (InjectorImpl.java:930) ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 9.294 s [INFO] Finished at: 2023-05-15T15:07:07+03:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M7:test (default-test) on project OpbuAppium: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M7:test failed: A required class was missing while executing org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M7:test: org/apache/maven/surefire/api/testset/TestSetFailedException ... [ERROR] Number of foreign imports: 1 [ERROR] import: Entry[import from realm ClassRealm[maven.api, parent: null]] [ERROR] [ERROR] ----------------------------------------------------- [ERROR] : org.apache.maven.surefire.api.testset.TestSetFailedException
POM配置
<?xml version="1.0" encoding="UTF-8"?> <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>OpbuAppium</groupId> <artifactId>OpbuAppium</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <hibernate-version>5.0.1.Final</hibernate-version> <aspectj.version>1.9.8</aspectj.version> <allure.version>2.13.2</allure.version> <junit.jupter.version>5.9.1</junit.jupter.version> <junit-platform-surefire-provider.version>1.3.2</junit-platform-surefire-provider.version> <allure-junit5.version>2.6.0</allure-junit5.version> </properties> <dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>io.appium</groupId> <artifactId>java-client</artifactId> <version>7.0.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-java-commons</artifactId> <version>2.13.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.3.0</version> </dependency> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-commandline</artifactId> <version>2.13.2</version> </dependency> <dependency> <groupId>com.github.javafaker</groupId> <artifactId>javafaker</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-maven</artifactId> <version>2.12.0</version> <type>maven-plugin</type> </dependency> <!--JUNIT 5 Dependencies--> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.jupter.version}</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.jupter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-engine</artifactId> <version>1.9.1</version> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> <version>1.9.1</version> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-runner</artifactId> <version>1.9.1</version> </dependency> <!--Allure Reporting Dependencies--> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-junit5</artifactId> <version>${allure-junit5.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <configuration> <testFailureIgnore>false</testFailureIgnore> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <systemProperties> <property> <name>junit.jupiter.extensions.autodetection.enabled</name> <value>true</value> </property> </systemProperties> </configuration> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-surefire-provider</artifactId> <version>${junit-platform-surefire-provider.version}</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.jupter.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> </dependencies> </plugin> <plugin> <groupId>io.qameta.allure</groupId> <artifactId>allure-maven</artifactId> <version>2.12.0</version> <configuration> <reportVersion>2.4.1</reportVersion> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
解决方案
这个错误的核心原因是版本不兼容:
- maven-surefire-plugin 3.0.0-M7是里程碑版本,稳定性不足,且从Surefire 3.0版本开始,已内置JUnit 5支持,无需手动引入
junit-platform-surefire-provider依赖——该provider在JUnit Platform 1.4+后已被弃用,与新版Surefire插件完全不兼容,这是类缺失的直接原因。 allure-junit5.version为2.6.0,与JUnit 5.9.1版本不匹配,可能引发额外兼容性问题。
具体修复步骤:
- 移除Surefire插件中的
junit-platform-surefire-provider依赖:直接删除<dependencies>下对应项。 - 升级maven-surefire-plugin到稳定版:替换为3.2.5(当前稳定版本)。
- 升级allure-junit5版本:更新为2.22.0,确保与JUnit 5.9.1兼容。
- (可选)清理本地Maven缓存:执行
mvn clean install -U,避免旧依赖干扰。
修改后的Surefire插件配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <configuration> <testFailureIgnore>false</testFailureIgnore> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <systemProperties> <property> <name>junit.jupiter.extensions.autodetection.enabled</name> <value>true</value> </property> </systemProperties> </configuration> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.jupter.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> </dependencies> </plugin>
同时更新properties中的allure-junit5版本:
<allure-junit5.version>2.22.0</allure-junit5.version>
完成修改后,重新执行测试命令即可解决类缺失问题。
内容的提问来源于stack exchange,提问作者Gordienko Andrey
相关产品推荐
相关产品推荐

