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

程序化运行Cucumber测试时如何实现服务注入与状态共享?

解决Cucumber程序化运行时的Spring依赖注入问题

问题1:为何配置了cucumber.glue仍提示需要上下文配置?

Cucumber-Spring的glue参数仅用于指定步骤定义、钩子等Glue代码的扫描路径,但Spring上下文的创建需要明确的配置类标记。即使你指定了glue,Cucumber-Spring依然无法自动识别Spring的配置规则,必须通过@CucumberContextConfiguration注解标记一个配置类,告知Cucumber如何初始化Spring上下文。

问题2:找不到DummyService Bean的解决方法

报错No qualifying bean of type 'DummyService' available是因为该类未被Spring容器管理,需要将其注册为Spring Bean:

  • 给DummyService类添加@Component注解(如果是Spring Boot项目,确保该类在Spring的组件扫描路径下);
  • 或者在Spring配置类中通过@Bean方法手动声明:
@Bean
public DummyService dummyService() {
    return new DummyService();
}

程序化运行Cucumber实现Spring注入与状态共享的完整步骤

  1. 添加Spring上下文配置类
    创建一个单独的配置类,标记@CucumberContextConfiguration和Spring上下文注解(以Spring Boot为例):
@CucumberContextConfiguration
@SpringBootTest
public class CucumberSpringConfig {
    // 无需额外代码,仅用于标记上下文配置
}

这个类要放在cucumber.glue指定的扫描路径下,确保Cucumber能扫描到它。

  1. 确保依赖配置正确
    确认pom.xml中已引入cucumber-spring依赖,且版本与Cucumber核心依赖一致:
<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-spring</artifactId>
    <version>${cucumber.version}</version>
    <scope>test</scope>
</dependency>
  1. 程序化运行时的配置
    在程序化运行Cucumber的代码中,除了指定glue参数,还要确保Spring的ObjectFactory被启用(Cucumber会自动检测到cucumber-spring依赖并使用SpringObjectFactory)。示例代码如下:
public class CucumberProgrammaticRunner {
    public static void main(String[] args) {
        String[] cucumberOptions = {
                "--glue", "org.example.cucumberseviceinjection", // 包含配置类和步骤定义的包
                "--features", "src/test/resources/features"
        };
        io.cucumber.core.cli.Main.run(cucumberOptions, Thread.currentThread().getContextClassLoader());
    }
}

这里的glue路径要覆盖配置类CucumberSpringConfig和步骤定义StepDefinitions所在的包,确保Cucumber能扫描到上下文配置和Glue代码。

  1. 验证步骤定义的构造注入
    此时StepDefinitions的构造注入可以正常工作,Spring会自动注入DummyService实例,且该实例的状态会在整个Cucumber测试生命周期内共享(因为Spring上下文在测试期间是单例的):
public class StepDefinitions {
    private final DummyService dummyService;

    public StepDefinitions(DummyService dummyService) {
        this.dummyService = dummyService;
    }

    // 步骤定义方法...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:15:08