Вопрос:

Как передать список в cucumber-jvm stepdef в последней версии 4.x

java regex list cucumber-jvm

11 просмотра

2 ответа

336 Репутация автора

У меня есть следующий Enum

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;
            }
        })
);

Но это не работает. Если я изменю шаблон регулярного выражения на «([^ '] *)», это сработает. Но я хочу, чтобы регулярное выражение было максимально ограниченным

Автор: Ida Amit Источник Размещён: 11.08.2019 08:31

Ответы (2)


0 плюса

38237 Репутация автора

Если вы хотите сопоставить список цветов КРАСНЫЙ, ЗЕЛЕНЫЙ, СИНИЙ, только первая группа образца, который вы пробовали, будет соответствовать 3 раза, а вторая группа шаблона не совпадает, так как пространство не совпадает.

Если вы соответствуете пробел, вы можете опустить границу слова \b

(RED|GREEN|BLUE)(, (RED|GREEN|BLUE))*

Regex demo

Если вы не ссылаетесь на группы в коде, вы можете также сделать их не захватывающими:

(?:RED|GREEN|BLUE)(?:, (?:RED|GREEN|BLUE))*

Шаблон ([^']*)будет записан в группе, соответствующей 0+ раз, а не a, 'и также будет соответствовать пустой строке.

Автор: The fourth bird Размещён: 11.08.2019 08:51

0 плюса

2886 Репутация автора

В дополнение к четвертому ответу птиц вы также можете использовать a 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());
                    }
                })
        );
    }
}
Автор: mpkorstanje Размещён: 11.08.2019 09:58
Вопросы из категории :
32x32