如何在最新 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))*

Regex demo

如果您没有在代码中引用组,您也可以将它们设置为非捕获:

(?: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());
                    }
                })
        );
    }
}