You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:05:39