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
尝试两种方案时遇到问题:
- 仅用小数正则的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() { } }
(注:原代码中引号转义有误,已修正为正确的正则格式)
- 分别定义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,因此触发未定义步骤错误。 - 双StepDefinition歧义:Cucumber内置的
{int}和{double}规则存在重叠,整数1会被{double}识别为1.0,导致Cucumber无法确定使用哪个StepDefinition,抛出歧义异常。
内容的提问来源于stack exchange,提问作者user2044296
相关产品推荐
相关产品推荐

