从 Cucumber java 中的场景大纲示例 table 中解析整数列表
Parse integer list from Scenario outline's example table in cucumber java
我必须使用带有 java 的黄瓜编写 BDD 测试,我想从我的示例 table 的每一行中解析一个整数列表,并使用该列表将此列表传递给我的步骤方法最新版本的黄瓜 (4.2.6)。
所以我在我的功能文件中得到了以下步骤定义:
Scenario Outline: Some scenarion
Given a list of integer: <integer_list>
Examples:
| integer_list |
| 2, 3, 5, 6 |
| 3, 12, 45, 5, 6|
我的代码中需要这样的东西:
@Given("a list of integer: (\d+.)")
public void storeIntegerList(List<Integer> integers) {
System.out.println(integers.size());
}
不幸的是,我找不到将这些值解析为列表的方法。它要么找不到 step 方法(我尝试了很多不同的正则表达式),要么抛出一个异常,告诉我我的数字无法转换为列表。
作为解决方法,我将列表解析为字符串,然后将其拆分。但是,我无法想象在 2019 年没有更好的方法来做到这一点。
解决方法:
Scenario Outline: Some scenarion
Given a list of integer: "<integer_list>"
Examples:
| integer_list |
| 2, 3, 5, 6 |
| 3, 12, 45, 5, 6|
@Given("a list of integer: {string}")
public void storeIntegerList(String integers) {
List<String> integersAsString = Arrays.asList(integers.split(","));
List<Integer> integerList = integersAsString.stream().map(s -> Integer.valueOf(s.trim())).collect(Collectors.toList());
System.out.println(integerList.size());
}
我按照@Grasshopper 的建议做了,并实现了我自己的 TypeRegistryConfigurer 并将它放在我的跑步者旁边 class(在 Glue 路径上):
import cucumber.api.TypeRegistry;
import cucumber.api.TypeRegistryConfigurer;
import io.cucumber.cucumberexpressions.ParameterType;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import static java.util.Locale.ENGLISH;
public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
@Override
public Locale locale() {
return ENGLISH;
}
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
typeRegistry.defineParameterType(new ParameterType<>(
"integerList", //this name can be used in the step method
"(-?[0-9]+(,\s*-?[0-9]+)*)", //regexp to match to a comma separated integer list which can contain negative numbers and whitespaces as well
List.class, //the expected parameter type
this::transform // equivalent to (String s) -> this.transformer(s), this is the transformer method which will be used to create the desired step parameter
));
}
//transforms the string form to an integer list
private List<Integer> transform(String integers) {
List<String> integersAsString = Arrays.asList(integers.split(","));
return integersAsString.stream().map(s -> Integer.valueOf(s.trim())).collect(Collectors.toList());
}
}
之后,我可以在 class 的步骤中执行以下操作:
@Given("a list of integer: {integerList}")
public void storeIntegerList(List<Integer> integers) {
System.out.println(integers.size());
}
特征文件可以这样使用:
Scenario Outline: Some scenarion
Given a list of integer: <integer_list>
Examples:
| integer_list |
| 2, 3, 5, 6 |
| 3, -12, 45, -5, 6|
对于 Cucumber 4+,有一种基于注释的方法来注册新类型。
对于整数列表,您可以这样做:
@ParameterType(name = "intList", value = "(-?\d+(,\s*-?\d+)*)")
public List<Integer> defineIntegerList(String value) {
// * -?\d+ : one or more digits, with optional negative sign at the start
// For a list it will be one of the above digits with none or more groups of
// "comma with digits", ignoring any whitespace before the digits
return Arrays.stream(value.split(",")).map(s -> Integer.valueOf(s.trim()))
.collect(Collectors.toList());
}
我必须使用带有 java 的黄瓜编写 BDD 测试,我想从我的示例 table 的每一行中解析一个整数列表,并使用该列表将此列表传递给我的步骤方法最新版本的黄瓜 (4.2.6)。 所以我在我的功能文件中得到了以下步骤定义:
Scenario Outline: Some scenarion
Given a list of integer: <integer_list>
Examples:
| integer_list |
| 2, 3, 5, 6 |
| 3, 12, 45, 5, 6|
我的代码中需要这样的东西:
@Given("a list of integer: (\d+.)")
public void storeIntegerList(List<Integer> integers) {
System.out.println(integers.size());
}
不幸的是,我找不到将这些值解析为列表的方法。它要么找不到 step 方法(我尝试了很多不同的正则表达式),要么抛出一个异常,告诉我我的数字无法转换为列表。
作为解决方法,我将列表解析为字符串,然后将其拆分。但是,我无法想象在 2019 年没有更好的方法来做到这一点。
解决方法:
Scenario Outline: Some scenarion
Given a list of integer: "<integer_list>"
Examples:
| integer_list |
| 2, 3, 5, 6 |
| 3, 12, 45, 5, 6|
@Given("a list of integer: {string}")
public void storeIntegerList(String integers) {
List<String> integersAsString = Arrays.asList(integers.split(","));
List<Integer> integerList = integersAsString.stream().map(s -> Integer.valueOf(s.trim())).collect(Collectors.toList());
System.out.println(integerList.size());
}
我按照@Grasshopper 的建议做了,并实现了我自己的 TypeRegistryConfigurer 并将它放在我的跑步者旁边 class(在 Glue 路径上):
import cucumber.api.TypeRegistry;
import cucumber.api.TypeRegistryConfigurer;
import io.cucumber.cucumberexpressions.ParameterType;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
import static java.util.Locale.ENGLISH;
public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
@Override
public Locale locale() {
return ENGLISH;
}
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
typeRegistry.defineParameterType(new ParameterType<>(
"integerList", //this name can be used in the step method
"(-?[0-9]+(,\s*-?[0-9]+)*)", //regexp to match to a comma separated integer list which can contain negative numbers and whitespaces as well
List.class, //the expected parameter type
this::transform // equivalent to (String s) -> this.transformer(s), this is the transformer method which will be used to create the desired step parameter
));
}
//transforms the string form to an integer list
private List<Integer> transform(String integers) {
List<String> integersAsString = Arrays.asList(integers.split(","));
return integersAsString.stream().map(s -> Integer.valueOf(s.trim())).collect(Collectors.toList());
}
}
之后,我可以在 class 的步骤中执行以下操作:
@Given("a list of integer: {integerList}")
public void storeIntegerList(List<Integer> integers) {
System.out.println(integers.size());
}
特征文件可以这样使用:
Scenario Outline: Some scenarion
Given a list of integer: <integer_list>
Examples:
| integer_list |
| 2, 3, 5, 6 |
| 3, -12, 45, -5, 6|
对于 Cucumber 4+,有一种基于注释的方法来注册新类型。 对于整数列表,您可以这样做:
@ParameterType(name = "intList", value = "(-?\d+(,\s*-?\d+)*)")
public List<Integer> defineIntegerList(String value) {
// * -?\d+ : one or more digits, with optional negative sign at the start
// For a list it will be one of the above digits with none or more groups of
// "comma with digits", ignoring any whitespace before the digits
return Arrays.stream(value.split(",")).map(s -> Integer.valueOf(s.trim()))
.collect(Collectors.toList());
}