Cucumber JVM 8中为何要将lambda步骤定义写在构造函数内
Cucumber JVM 8 Lambda 步骤定义与Hook编写问题解答
Lambda形式定义写在构造函数内的核心原因
- 适配场景隔离机制:Cucumber 为每个测试场景都会生成独立的 glue 类实例,将lambda形式的步骤定义、Hook放在构造函数内注册,能保证每轮场景执行前相关定义都会被重新加载,完全符合Cucumber默认的场景间状态隔离要求,不会出现不同场景数据互相影响的问题。
- 兼容依赖注入逻辑:如果项目使用Spring、Guice等依赖注入框架和Cucumber集成,构造函数内注册的lambda可以直接使用构造函数注入的各类业务实例,不需要额外编写上下文获取代码,实现更简洁。
- 符合官方注册规则:Cucumber 对lambda形式的注册方法(
Given/When/Then/Before/After等)做了限制,仅允许在glue类的实例初始化阶段(也就是构造函数执行过程中)调用,其他时机调用不会被Cucumber识别。
能否将lambda形式定义写在构造函数外
不可以
Lambda形式的步骤、Hook本质是调用Cucumber提供的注册方法完成定义,这类方法仅在glue类构造执行阶段有效,如果你在构造函数外的普通成员方法、静态代码块、类初始化逻辑里调用这些注册方法,要么会直接抛出运行时异常,要么Cucumber会完全忽略这些定义,执行时提示步骤未找到。
如果不想使用lambda+构造函数的写法,可以选择注解形式的步骤定义,不需要把逻辑写在构造函数内,示例如下:
public class TestStepDefs { // 注解形式的Hook @Before public void initTestData() { // 前置逻辑 } // 注解形式的步骤定义 @Given("用户已经登录系统,账号为{string}") public void userLogin(String account) { // 步骤逻辑 } }
内容的提问来源于stack exchange,提问作者bugCracker
相关产品推荐
相关产品推荐

