JUnit 5 @MethodSource参数化测试执行失败问题求助
JUnit 5参数化测试执行失败排查与解决
问题重现
编写了如下JUnit 5参数化测试代码:
@ParameterizedTest @DisplayName("Test Valid Video With Slides") @MethodSource("slidesTestsArguments") void testValidVideoWithSlides(VersionData versionData) { SlidesResponse slidesResponse = testsHelper.callVideosSlidesRequest(versionData); assertAll( "Validating response of transcript ep for a video with transcript", () -> assertEquals(validPublishedSlidesVideoId, slidesResponse.videoId, "VideoId is not as expected"), () -> assertNotEquals(0, slidesResponse.slides.size(), "Segments number should be more than 0") ); }
参数提供方法:
static Stream<Arguments> slidesTestsArguments() { return Stream.of( Arguments.of(new V2Data()), Arguments.of(new V3Data()), Arguments.of(new V4Data()) ); }
甚至简单的Integer参数测试也触发相同错误:
static Stream<Integer> testArguments() { return Stream.of(1, 2 ,3); } @ParameterizedTest @MethodSource("testArguments") void testInteger(Integer n) { System.out.println(n); }
运行时抛出错误:
java.lang.AbstractMethodError: Receiver class org.junit.jupiter.engine.descriptor.TestTemplateExtensionContext does not define or inherit an implementation of the resolved method 'abstract org.junit.jupiter.api.extension.ExecutableInvoker getExecutableInvoker()' of interface org.junit.jupiter.api.extension.ExtensionContext. at org.junit.jupiter.params.provider.MethodArgumentsProvider.lambda$provideArguments$1(MethodArgumentsProvider.java:54) ... Suppressed: org.junit.platform.commons.PreconditionViolationException: Configuration error: You must configure at least one set of arguments for this @ParameterizedTest ...
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> <groupId>com.aaaaaa</groupId> <artifactId>aasasa-dfsdfsdfsd-api-test</artifactId> <version>10.0.0</version> <properties> <maven.compiler.version>3.8.1</maven.compiler.version> <java.version>15</java.version> <junit-jupiter.version>5.9.1</junit-jupiter.version> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M5</version> <configuration> <testFailureIgnore>false</testFailureIgnore> <includes> <include>**/SanityTMTestsSuite*.java</include> </includes> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> </configuration> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit-jupiter.version}</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit-jupiter.version}</version> </dependency> <!--JUnit Jupiter Engine to depend on the JUnit5 engine and JUnit 5 API --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit-jupiter.version}</version> </dependency> </dependencies> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-report-plugin</artifactId> <version>3.0.0-M5</version> <type>maven-plugin</type> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>3.0.13</version> <type>pom</type> <scope>compile</scope> </dependency> <dependency> <groupId>pl.pragmatists</groupId> <artifactId>JUnitParams</artifactId> <version>1.1.1</version> <scope>test</scope> </dependency> <!--JUnit Jupiter Engine to depend on the JUnit4 engine and JUnit 4 API --> <dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <version>${junit-jupiter.version}</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>${junit-jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.14.1</version> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.7.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-suite-engine</artifactId> <version>1.9.0</version> <scope>test</scope> </dependency> </dependencies>
原因分析
核心问题是JUnit相关组件版本不匹配:
junit-jupiter.version使用5.9.1,对应的JUnit Platform版本应为1.9.1,但junit-platform-suite-engine版本是1.9.0,版本不一致导致接口方法不兼容。AbstractMethodError表明运行时加载的类实现缺少接口定义的方法,这里是旧版本JUnit Platform组件(1.9.0)未实现新版本JUnit Jupiter(5.9.1)中ExtensionContext接口新增的getExecutableInvoker()方法。- 额外问题:pom中存在重复JUnit依赖(
junit-jupiter聚合包已包含junit-jupiter-api、junit-jupiter-engine、junit-jupiter-params,无需单独引入),可能加剧依赖冲突。
解决办法
1. 统一JUnit Platform版本
将junit-platform-suite-engine版本修改为与junit-jupiter.version一致的5.9.1:
<dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-suite-engine</artifactId> <version>${junit-jupiter.version}</version> <scope>test</scope> </dependency>
2. 简化JUnit依赖
移除重复的JUnit依赖,junit-jupiter聚合包已包含所需核心组件:
- 删除dependencies中的
junit-jupiter-api、junit-jupiter-engine、junit-jupiter-params单独依赖 - 删除surefire插件中的
junit-jupiter-api、junit-jupiter-engine依赖,仅保留junit-jupiter
修改后的surefire插件依赖:
<dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit-jupiter.version}</version> </dependency> </dependencies>
3. 移除不必要的测试框架依赖(可选)
如果不使用JUnitParams和TestNG,建议移除这两个依赖,避免与JUnit 5参数化功能冲突:
<!-- 移除以下依赖(若无需使用) --> <dependency> <groupId>pl.pragmatists</groupId> <artifactId>JUnitParams</artifactId> <version>1.1.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.7.0</version> <scope>test</scope> </dependency>
4. 更新maven-surefire-plugin版本(可选)
将surefire插件升级到稳定版本,比如3.2.2,提升兼容性:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.2</version> <!-- 其他配置保持不变 --> </plugin>
5. 清理Maven依赖
执行命令清理并重新下载依赖:
mvn clean install -U
验证
修改完成后重新运行参数化测试,应能正常执行,不再抛出AbstractMethodError和参数配置错误。
内容的提问来源于stack exchange,提问作者TalClip
相关产品推荐
相关产品推荐

