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

无法运行TestNG测试:Cucumber执行报NullPointerException问题求助

修复Cucumber + TestNG Runner的NullPointerException问题

问题重现

执行测试时触发以下空指针异常:

Caused by: java.lang.NullPointerException: Cannot invoke "io.cucumber.testng.TestNGCucumberRunner.provideScenarios()" because "this.testNGCucumberRunner" is null
    at Runner.TestRunner.scenarios(TestRunner.java:36)

FAILED CONFIGURATION: @AfterClass Runner.TestRunner.tearDownClass
java.lang.NullPointerException: Cannot invoke "io.cucumber.testng.TestNGCucumberRunner.finish()" because "this.testNGCucumberRunner" is null
    at Runner.TestRunner.tearDownClass(TestRunner.java:41)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
    at org.testng.

核心原因

  1. TestNG执行顺序异常:@DataProvider方法可能在@BeforeClass初始化testNGCucumberRunner之前被调用,导致空指针。
  2. 手动实现初始化逻辑易出错,且glue路径存在拼写错误(sr//test//java//steps应为src/test/java/steps)。

修复方案

推荐方案:继承Cucumber抽象类

Cucumber的TestNG集成包提供了AbstractTestNGCucumberTests抽象类,已封装所有必要的初始化、测试执行和销毁逻辑,无需手动实现,彻底规避空指针问题。

修复后的完整代码:

import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;

@CucumberOptions(
        features = "src/test/java/features",
        glue = "src/test/java/steps" // 若steps是直接包名,可简化为"steps"
        // plugin={"pretty", "io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm"}
        // tags="@Amazon"
)
public class TestRunner extends AbstractTestNGCucumberTests {
    // 无需额外编写方法,抽象类已实现所有必要逻辑
}

备选方案:手动修正初始化逻辑(不推荐)

若必须手动实现,需确保@DataProvider依赖@BeforeClass执行,同时修正glue路径:

import io.cucumber.testng.CucumberOptions;
import io.cucumber.testng.FeatureWrapper;
import io.cucumber.testng.PickleWrapper;
import io.cucumber.testng.TestNGCucumberRunner;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

@CucumberOptions(
        features = "src/test/java/features",
        glue = "src/test/java/steps" // 修正路径拼写错误
        // plugin={"pretty", "io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm"}
        // tags="@Amazon"
)
public class TestRunner {
    
    private TestNGCucumberRunner testNGCucumberRunner;

    @BeforeClass(alwaysRun = true)
    public void setUpClass() {
        testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
    }

    @Test(groups = "cucumber", description = "Runs Cucumber Scenarios", dataProvider = "scenarios")
    public void scenario(PickleWrapper pickle, FeatureWrapper cucumberFeature) {
        testNGCucumberRunner.runScenario(pickle.getPickle());
    }

    @DataProvider(parallel = false) // 禁用并行,确保BeforeClass先执行
    public Object[][] scenarios() {
        if (testNGCucumberRunner == null) {
            throw new IllegalStateException("TestNGCucumberRunner未初始化,请检查BeforeClass是否执行");
        }
        return testNGCucumberRunner.provideScenarios();
    }

    @AfterClass(alwaysRun = true)
    public void tearDownClass() {
        if (testNGCucumberRunner != null) {
            testNGCucumberRunner.finish();
        }
    }
}

额外检查项

  • 确保所有Cucumber相关依赖版本统一(如cucumber-java和cucumber-testng版本一致),避免版本冲突。
  • 验证features路径和glue路径正确,确保Cucumber能找到.feature文件和步骤定义类。

内容的提问来源于stack exchange,提问作者Anil Mengji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:52:28