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()));
}
}
关键点解析:
- 参数传递:
Given
步骤中的(Integer money)
直接捕获正则匹配的数值 - 代码简洁性:单行表达式无需花括号,比传统匿名类更清爽
- 类型安全:通过 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 项目仓库,可直接克隆体验。