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

Cucumber能否用单个步骤定义适配int与double类型?如何处理?

Cucumber中能否用单个StepDefinition同时适配int和double类型?若不行,如何在不转字符串或统一类型的前提下处理?

问题背景

给定如下Feature文件:

Feature: Testing

Scenario: Test1
When User enters 1 
Then Print "Hello"

Scenario: Test2
When User enters 1.0 
Then don't print anything

尝试两种方案时遇到问题:

  1. 仅用小数正则的StepDefinition:出现「steps are undefined」错误,代码如下:
public class test {
 
    @Then("Print {string}")
    public void print(String string) {
        System.out.println(string);
    }

    @When("^User enters (\\d+\\.\\d+)$")
    public void user_enters(Double double1) {
       System.out.println(double1);
    }
    @Then("don't print anything")
    public void don_t_print_anything() {
       }
}

(注:原代码中引号转义有误,已修正为正确的正则格式)

  1. 分别定义int和double的StepDefinition:抛出io.cucumber.core.runner.AmbiguousStepDefinitionsException异常,代码如下:
public class test {
@When("User enters {int}")
public void user_enters(Integer int1) {
   System.out.println(int1);
}

@Then("Print {string}")
public void print(String string) {
   System.out.println(string);
}

@When("User enters {double}")
public void user_enters(Double double1) {
    System.out.println(double1);
}
 @Then("don't print anything")
 public void don_t_print_anything() {
           }
}

解决方案

直接用Cucumber内置的{int}和{double}参数类型会触发歧义,因为整数输入会同时匹配两种类型的规则。可以通过以下两种方式解决,无需将参数转成字符串或强制统一类型:

方法一:自定义ParameterType

通过自定义参数类型,统一匹配整数和小数格式的数字,绑定到Number类型(Integer和Double均为Number子类),单个StepDefinition即可处理两种输入:

首先定义参数类型转换器:

import io.cucumber.java.ParameterType;

public class ParameterTypes {
    @ParameterType("\\d+(\\.\\d+)?")
    public Number number(String input) {
        return input.contains(".") ? Double.parseDouble(input) : Integer.parseInt(input);
    }
}

然后编写StepDefinition:

import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;

public class TestSteps {
    @When("User enters {number}")
    public void user_enters(Number number) {
        if (number instanceof Integer) {
            System.out.println("处理整数输入:" + number);
        } else if (number instanceof Double) {
            System.out.println("处理小数输入:" + number);
        }
    }

    @Then("Print {string}")
    public void print(String string) {
        System.out.println(string);
    }

    @Then("don't print anything")
    public void don_t_print_anything() {
    }
}

方法二:用正则匹配所有数字,绑定到Number类型

如果不想自定义ParameterType,可直接在StepDefinition注解中写兼容整数和小数的正则,参数用Number接收:

import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;

public class TestSteps {
    @When("^User enters (\\d+(?:\\.\\d+)?)$")
    public void user_enters(Number number) {
        if (number instanceof Integer) {
            System.out.println("整数输入:" + number);
        } else if (number instanceof Double) {
            System.out.println("小数输入:" + number);
        }
    }

    @Then("Print {string}")
    public void print(String string) {
        System.out.println(string);
    }

    @Then("don't print anything")
    public void don_t_print_anything() {
    }
}

错误原因说明

  1. 正则方案未匹配到步骤:原代码中的正则仅匹配带小数点的数字,无法匹配整数输入1,因此触发未定义步骤错误。
  2. 双StepDefinition歧义:Cucumber内置的{int}和{double}规则存在重叠,整数1会被{double}识别为1.0,导致Cucumber无法确定使用哪个StepDefinition,抛出歧义异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:50:24