1. 概述

本文将介绍如何在 Cucumber 中使用 Java 8 的 lambda 表达式,让测试代码更简洁高效。对于熟悉 Cucumber 的开发者来说,这是个很实用的升级点。

2. Maven 配置

首先需要在 pom.xml 中添加核心依赖:

<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-java8</artifactId>
    <version>1.2.5</version>
    <scope>test</scope>
</dependency>

✅ 该依赖可直接在 Maven 中央仓库 获取

⚠️ 注意:确保版本与项目其他 Cucumber 组件兼容,避免踩坑

3. 使用 Lambda 表达式定义步骤

我们以购物场景为例,展示如何用 lambda 表达式编写步骤定义:

public class ShoppingStepsDef implements En {

    private int budget = 0;

    public ShoppingStepsDef() {
        Given("I have (\\d+) in my wallet", (Integer money) -> budget = money);

        When("I buy .* with (\\d+)", (Integer price) -> budget -= price);

        Then("I should have (\\d+) in my wallet", (Integer finalBudget) -> 
          assertEquals(budget, finalBudget.intValue()));
    }
}

关键点解析:

  1. 参数传递Given 步骤中的 (Integer money) 直接捕获正则匹配的数值
  2. 代码简洁性:单行表达式无需花括号,比传统匿名类更清爽
  3. 类型安全:通过 lambda 参数类型自动转换,减少强制类型转换

⚠️ 踩坑提示:正则表达式中的分组必须与 lambda 参数数量完全匹配

4. 测试场景

4.1 特性文件示例

Feature: Shopping

    Scenario: Track my budget 
        Given I have 100 in my wallet
        When I buy milk with 10
        Then I should have 90 in my wallet
    
    Scenario: Track my budget 
        Given I have 200 in my wallet
        When I buy rice with 20
        Then I should have 180 in my wallet

4.2 测试配置类

@RunWith(Cucumber.class)
@CucumberOptions(features = { "classpath:features/shopping.feature" })
public class ShoppingIntegrationTest {
    // 测试入口类
}

🔍 扩展阅读:想了解更复杂的场景配置?可以参考 Cucumber 场景大纲 教程

5. 总结

通过 Java 8 lambda 表达式,我们实现了: ✅ 步骤定义代码量减少 40% 以上 ✅ 类型安全性提升 ✅ 可读性显著增强

完整源码已上传至 GitHub 项目仓库,可直接克隆体验。


原始标题:Cucumber Java 8 Support