如何在Cucumber 7中配置TypeRegistryConfigurer实现类型自动配置
在Cucumber 7中配置TypeRegistryConfigurer实现类型自动转换
在Cucumber 7里配置TypeRegistryConfigurer来实现自定义类型的自动解析/转换很直接,按以下步骤操作:
1. 实现TypeRegistryConfigurer接口
创建类实现io.cucumber.core.api.TypeRegistryConfigurer接口,这是Cucumber加载类型转换规则的入口,需要重写两个核心方法:
方法说明
locale():指定Cucumber解析时使用的区域设置,会影响日期、数字等格式的解析逻辑。configureTypeRegistry(TypeRegistry typeRegistry):配置类型转换的核心方法,在这里注册自定义参数转换器、数据表转换器。
示例代码
import io.cucumber.core.api.TypeRegistry; import io.cucumber.core.api.TypeRegistryConfigurer; import java.time.LocalDateTime; import java.util.Locale; import java.util.Map; import io.cucumber.datatable.DataTableType; import io.cucumber.datatable.ParameterType; // 自定义实体类示例 class Person { private String firstName; private String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } // 省略getter/setter } public class CustomTypeConfigurer implements TypeRegistryConfigurer { @Override public Locale locale() { // 根据需求指定区域,比如中文用Locale.CHINA return Locale.ENGLISH; } @Override public void configureTypeRegistry(TypeRegistry typeRegistry) { // 注册步骤参数转换器:将字符串转为Person对象 typeRegistry.defineParameterType(new ParameterType<>( "person", // 类型标识,步骤定义中用{person}引用 "[A-Za-z]+ [A-Za-z]+", // 匹配输入字符串的正则 Person.class, // 目标类型 (String input) -> { String[] nameParts = input.split(" "); return new Person(nameParts[0], nameParts[1]); } )); // 注册DataTable转换器:将数据表行转为LocalDateTime typeRegistry.defineDataTableType(new DataTableType( LocalDateTime.class, (Map<String, String> row) -> LocalDateTime.parse(row.get("datetime")) )); } }
2. 确保配置类被Cucumber扫描到
Cucumber仅扫描glue路径下的配置类,所以需要:
- 把
CustomTypeConfigurer放在步骤定义所在的包(或其子包)中; - 如果用JUnit 5运行,在测试套件类中通过
@CucumberOptions指定glue路径包含该类的包,示例:
import org.junit.platform.suite.api.ConfigurationParameter; import org.junit.platform.suite.api.IncludeEngines; import org.junit.platform.suite.api.SelectPackages; import org.junit.platform.suite.api.Suite; import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME; @Suite @IncludeEngines("cucumber") @SelectPackages("com.yourproject.steps") // 替换为你的实际包路径 @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "com.yourproject.steps") public class CucumberTestSuite {}
3. 验证配置生效
写一个使用自定义类型的步骤定义:
import io.cucumber.java.en.Given; public class UserSteps { @Given("用户 {person} 已完成注册") public void verifyUserRegistered(Person person) { // 直接使用转换后的Person对象 System.out.println("已注册用户:" + person.getFirstName() + " " + person.getLastName()); } }
对应的feature文件内容:
Feature: 用户注册验证 Scenario: 检查已注册用户 Given 用户 "John Doe" 已完成注册
运行测试,Cucumber会自动把字符串"John Doe"转换成Person对象并注入到步骤方法中。
内容的提问来源于stack exchange,提问作者Tohid Makari
相关产品推荐
相关产品推荐

