如何在最新的4.x版本中将列表传递给cucumber-jvm stepdef



>我有以下枚举

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的类中,我写了

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次,而图案的第二组不匹配,因为空间不匹配。

如果匹配空格,则可以省略单词边界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());
}
})
);
}
}

最新更新