程序化运行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注入与状态共享的完整步骤
- 添加Spring上下文配置类
创建一个单独的配置类,标记@CucumberContextConfiguration和Spring上下文注解(以Spring Boot为例):
@CucumberContextConfiguration @SpringBootTest public class CucumberSpringConfig { // 无需额外代码,仅用于标记上下文配置 }
这个类要放在cucumber.glue指定的扫描路径下,确保Cucumber能扫描到它。
- 确保依赖配置正确
确认pom.xml中已引入cucumber-spring依赖,且版本与Cucumber核心依赖一致:
<dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-spring</artifactId> <version>${cucumber.version}</version> <scope>test</scope> </dependency>
- 程序化运行时的配置
在程序化运行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代码。
- 验证步骤定义的构造注入
此时StepDefinitions的构造注入可以正常工作,Spring会自动注入DummyService实例,且该实例的状态会在整个Cucumber测试生命周期内共享(因为Spring上下文在测试期间是单例的):
public class StepDefinitions { private final DummyService dummyService; public StepDefinitions(DummyService dummyService) { this.dummyService = dummyService; } // 步骤定义方法... }
内容的提问来源于stack exchange,提问作者florin
相关产品推荐
相关产品推荐

