如何在最新 4.x 版本中将列表传递给 cucumber-jvm stepdef
How to pass list to cucumber-jvm stepdef in latest 4.x version
我有以下枚举
public enum Color {
RED, GREEN, BLUE
}
在功能文件中我有以下内容
Then verify policy status flow:RED, GREEN, BLUE
在步骤文件中,我写道:
@Then("verify policy status flow:{colorList}")
public void verifyPolicyStatusFlow(List<Color> myColors) {
}
在实现TypeRegistryConfigurer的class中,我写了
typeRegistry.defineParameterType(new ParameterType<List>(
"colorList",
"(RED|GREEN|BLUE)(,\b(RED|GREEN|BLUE))*",
List.class,
new Transformer<List>() {
@Override
public List<Color> transform(String s) {
List<Color> collect = Arrays.stream(s.split(", ")).map(e -> Color.valueOf(e)).collect(Collectors.toList());
return collect;
}
})
);
但是没用。
如果我将正则表达式模式更改为 "([^']*)" 它会起作用。但我希望正则表达式尽可能地受到限制
如果你想匹配红色、绿色、蓝色的颜色列表,只有第一组你试过的图案会匹配3次,第二组图案不匹配,因为space不是正在匹配。
如果匹配space,可以省略单词边界\b
(RED|GREEN|BLUE)(, (RED|GREEN|BLUE))*
如果您没有在代码中引用组,您也可以将它们设置为非捕获:
(?:RED|GREEN|BLUE)(?:, (?:RED|GREEN|BLUE))*
模式 ([^']*)
将在组中捕获匹配 0+ 次而不是 '
并且还将匹配空字符串。
除了第四只鸟的答案之外,您还可以使用 CaptureGroupTransformer
来转换正则表达式中的捕获组。这避免了拆分和清理字符串的需要。
public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
@Override
public Locale locale() {
return Locale.ENGLISH;
}
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
typeRegistry.defineParameterType(new ParameterType<>(
"colorList",
"(RED|GREEN|BLUE)(?:, (RED|GREEN|BLUE))*",
List.class,
new CaptureGroupTransformer<List>() {
@Override
public List<Color> transform(String... args) {
return Arrays.stream(args)
.map(Color::valueOf)
.collect(Collectors.toList());
}
})
);
}
}
我有以下枚举
public enum Color {
RED, GREEN, BLUE
}
在功能文件中我有以下内容
Then verify policy status flow:RED, GREEN, BLUE
在步骤文件中,我写道:
@Then("verify policy status flow:{colorList}")
public void verifyPolicyStatusFlow(List<Color> myColors) {
}
在实现TypeRegistryConfigurer的class中,我写了
typeRegistry.defineParameterType(new ParameterType<List>(
"colorList",
"(RED|GREEN|BLUE)(,\b(RED|GREEN|BLUE))*",
List.class,
new Transformer<List>() {
@Override
public List<Color> transform(String s) {
List<Color> collect = Arrays.stream(s.split(", ")).map(e -> Color.valueOf(e)).collect(Collectors.toList());
return collect;
}
})
);
但是没用。 如果我将正则表达式模式更改为 "([^']*)" 它会起作用。但我希望正则表达式尽可能地受到限制
如果你想匹配红色、绿色、蓝色的颜色列表,只有第一组你试过的图案会匹配3次,第二组图案不匹配,因为space不是正在匹配。
如果匹配space,可以省略单词边界\b
(RED|GREEN|BLUE)(, (RED|GREEN|BLUE))*
如果您没有在代码中引用组,您也可以将它们设置为非捕获:
(?:RED|GREEN|BLUE)(?:, (?:RED|GREEN|BLUE))*
模式 ([^']*)
将在组中捕获匹配 0+ 次而不是 '
并且还将匹配空字符串。
除了第四只鸟的答案之外,您还可以使用 CaptureGroupTransformer
来转换正则表达式中的捕获组。这避免了拆分和清理字符串的需要。
public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
@Override
public Locale locale() {
return Locale.ENGLISH;
}
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
typeRegistry.defineParameterType(new ParameterType<>(
"colorList",
"(RED|GREEN|BLUE)(?:, (RED|GREEN|BLUE))*",
List.class,
new CaptureGroupTransformer<List>() {
@Override
public List<Color> transform(String... args) {
return Arrays.stream(args)
.map(Color::valueOf)
.collect(Collectors.toList());
}
})
);
}
}