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

Cucumber版本迁移后步骤定义正则转义报错求助

解决Cucumber新版本步骤定义报错的思路

问题根源是新版Cucumber默认使用Cucumber表达式替代了旧版的正则表达式语法,你原来的步骤定义里用了(\w+)这种正则写法,在Cucumber表达式里会被识别为非法转义,所以触发报错。

下面是两种可行的解决方法:

方法一:改用Cucumber表达式(官方推荐)

Cucumber表达式有内置的类型匹配器,{word}可以匹配字母、数字和下划线组成的字符串,和你原来的\w+效果完全一致。修改步骤定义的注解即可:

@Given("I link signaal {word} with another signal {word}")
public void iLinkSignals(Reference signaalRef1, Reference signaalRef2){
    // 原有业务逻辑不变
    WerkInstructie signaal1 = signaalContext.getSignal(signaalRef1);
    WerkInstructie signaal2 = signaalContext.getSignal(signaalRef2);
    LinkedWerkInstructie linkedWerkInstructie = new LinkedWerkInstructie().withWerkInstructieId(signaal2.getId())
            .withWerkInstructieType(signaal2.getWIType());
    this.getRestAbstractWerkInstructieDriver().addLinkedWerkInstructie(SIGNAAL_RESOURCE_PATH, signaal1.getId(), linkedWerkInstructie);
}

方法二:强制使用正则表达式(兼容旧代码场景)

如果你想保留正则写法,需要给表达式加上^和$来明确标记这是正则表达式,同时注意Java中反斜杠需要转义成\\:

@Given("^I link signaal (\\w+) with another signal (\\w+)$")
public void iLinkSignals(Reference signaalRef1, Reference signaalRef2){
    // 原有业务逻辑不变
    WerkInstructie signaal1 = signaalContext.getSignal(signaalRef1);
    WerkInstructie signaal2 = signaalContext.getSignal(signaalRef2);
    LinkedWerkInstructie linkedWerkInstructie = new LinkedWerkInstructie().withWerkInstructieId(signaal2.getId())
            .withWerkInstructieType(signaal2.getWIType());
    this.getRestAbstractWerkInstructieDriver().addLinkedWerkInstructie(SIGNAAL_RESOURCE_PATH, signaal1.getId(), linkedWerkInstructie);
}

注意:方法二更适合临时兼容,长期来看推荐用方法一的Cucumber表达式,它更简洁易读,也符合新版Cucumber的设计方向。

内容的提问来源于stack exchange,提问作者EBruno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:36:24