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

求助:SystemStubs/Pioneer在Cucumber(JUnit5)步骤定义中失效

问题解决:Cucumber步骤定义中SystemStubs注入失败的问题

问题根源

Cucumber拥有独立的测试生命周期,与JUnit 5的扩展机制不兼容。你添加的@ExtendWith(SystemStubsExtension.class)和@SystemStub注解仅对JUnit原生测试方法(比如你的testEnvVar)生效,但无法作用于Cucumber的步骤定义方法,因此environmentVariables实例未被注入,导致空指针异常。

可行解决方案

方案1:手动管理SystemStubs实例

利用Cucumber的@Before和@After钩子,手动初始化和清理EnvironmentVariables:

import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
import io.cucumber.java.After;
import io.cucumber.java.Before;
import io.cucumber.java.en.Given;

public class EnvHelperStepDefs {
    private EnvironmentVariables environmentVariables;

    @Before
    public void setUpEnvironment() {
        environmentVariables = new EnvironmentVariables();
    }

    @After
    public void restoreEnvironment() {
        environmentVariables.restore();
    }

    @Given("the environment variable \"HOSTING_MODE\" is set to \"public\"")
    public void hostingModePublic() {
        environmentVariables.set("HOSTING_MODE", "public");
        assert EnvHelper.isPublicMode();
    }
}

方案2:使用SystemStubs的静态工具方法

通过静态方法withEnvironmentVariable直接包裹测试逻辑,无需维护实例:

import static uk.org.webcompere.systemstubs.SystemStubs.withEnvironmentVariable;
import io.cucumber.java.en.Given;

public class EnvHelperStepDefs {
    @Given("the environment variable \"HOSTING_MODE\" is set to \"public\"")
    public void hostingModePublic() throws Exception {
        withEnvironmentVariable("HOSTING_MODE", "public")
            .execute(() -> {
                assert EnvHelper.isPublicMode();
            });
    }
}

方案3:自定义Cucumber扩展(进阶)

如果需要在多个步骤类中复用环境变量管理逻辑,可以自定义Cucumber插件,将SystemStubs的初始化和恢复逻辑整合到Cucumber的生命周期中:

import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
import io.cucumber.plugin.EventListener;
import io.cucumber.plugin.event.EventPublisher;
import io.cucumber.plugin.event.TestRunFinished;
import io.cucumber.plugin.event.TestRunStarted;

public class SystemStubsCucumberPlugin implements EventListener {
    private EnvironmentVariables environmentVariables;

    @Override
    public void setEventPublisher(EventPublisher publisher) {
        publisher.registerHandlerFor(TestRunStarted.class, event -> {
            environmentVariables = new EnvironmentVariables();
        });

        publisher.registerHandlerFor(TestRunFinished.class, event -> {
            if (environmentVariables != null) {
                environmentVariables.restore();
            }
        });
    }

    public EnvironmentVariables getEnvironmentVariables() {
        return environmentVariables;
    }
}

然后在cucumber.properties中配置插件:

cucumber.plugin=your.package.SystemStubsCucumberPlugin

步骤类中可以通过上下文获取插件实例来使用EnvironmentVariables。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:30:58