You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cucumber 2 升级至Cucumber 7:Transformer与@Transform迁移咨询

Cucumber 2 升级到 Cucumber 7:Transformer 与 @Transform 迁移方案

Cucumber 7 已经彻底移除了旧版的 Transformer 抽象类和 @Transform 注解,需要改用新的类型转换机制来实现相同功能。以下是两种可行的迁移方案:

方案一:直接用 @ParameterType 定义转换逻辑(适合简单场景)

这种方式无需额外的转换器类,直接在步骤类里定义参数的转换规则,代码更简洁:

import io.cucumber.java.ParameterType;
import io.cucumber.java.en.And;
import cucumber.runtime.java.guice.ScenarioScoped;
import java.util.Optional;

@ScenarioScoped
public class StepDefinitions {

    // 定义参数类型,匹配正则分组的结果,转换为 Optional<String>
    @ParameterType("(not)?")
    public Optional<String> optionalString(String input) {
        return Optional.ofNullable(input);
    }

    @And("^Some ?(not)? step?$")
    public void someStep(Optional<String> example) {
        // Step code
    }
}

说明:@ParameterType 的值要和步骤正则里的分组匹配,这里的"(not)?"对应原步骤中的分组,转换方法会自动把匹配到的字符串转为Optional<String>,步骤方法直接声明参数类型即可。

方案二:用 TypeConverter 结合 TypeRegistryConfigurer(适合复用转换逻辑)

如果需要在多个步骤类里复用相同的转换逻辑,可以单独定义转换器并全局注册:

1. 实现 TypeConverter

import io.cucumber.core.api.TypeConverter;
import java.util.Optional;

public class OptionalStringConverter implements TypeConverter<String, Optional<String>> {
    @Override
    public Optional<String> convert(String input) {
        return Optional.ofNullable(input);
    }
}

2. 注册转换器

创建配置类把转换器注册到Cucumber的类型注册表:

import io.cucumber.core.api.TypeRegistry;
import io.cucumber.core.api.TypeRegistryConfigurer;
import java.util.Locale;

public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
    @Override
    public Locale locale() {
        return Locale.ENGLISH;
    }

    @Override
    public void configureTypeRegistry(TypeRegistry typeRegistry) {
        // 注册String到Optional<String>的转换器
        typeRegistry.addTypeConverter(String.class, Optional.class, new OptionalStringConverter());
    }
}

3. 简化步骤类

步骤方法无需任何额外注解,直接声明参数类型即可:

import io.cucumber.java.en.And;
import cucumber.runtime.java.guice.ScenarioScoped;
import java.util.Optional;

@ScenarioScoped
public class StepDefinitions {
    @And("^Some ?(not)? step?$")
    public void someStep(Optional<String> example) {
        // Step code
    }
}

说明:这种方式下,所有需要将String转为Optional<String>的步骤参数都会自动应用该转换逻辑。

另外,原代码中的@ScenarioScoped注解在Cucumber 7的Guice集成中依然有效,无需修改。

内容的提问来源于stack exchange,提问作者João Manoel Pampanini Filho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:42:33