Как передать пользовательский тип данных в cucumber-jvm stepdef в последней версии 4.x - PullRequest
0 голосов
/ 04 марта 2019

Я недавно обновил до последней версии 4.x cucumber-jvm в своем проекте, чтобы использовать функцию параллельного выполнения cucumber.Но сейчас я сталкиваюсь с этой проблемой, связанной с наличием пользовательского типа данных в качестве параметра.Ранее у нас был интерфейс под названием Transformer, который мы можем реализовать для пользовательских типов данных, теперь в последней версии я нашел интерфейс TypeRegistryConfigurer, который необходимо реализовать.Но это не признание шага, как я ожидал.Подробности следующие:

Шаг огурца:

Given user gets random(3,true,true) parameter

Степень определения:

@Given("user gets {random} parameter")
public void paramTest(RandomString randomString) {
    System.out.println(randomString.string); 
}

Класс RandomString:

public class RandomString {

public String string;

public RandomString(String string) {
    Matcher m = Pattern.compile("random\\((.?)\\)").matcher(string);
    String t = "";
    while (m.find()) {
        t = m.group(1);
    }
    boolean isAlpha = true, isNum = true;
    if (t.length() > 0) {
        String[] placeholders = t.split(",");
        if (placeholders.length == 3) {
            int count = Integer.parseInt(placeholders[0]);
            isAlpha = Boolean.valueOf(placeholders[1]);
            isNum = Boolean.valueOf(placeholders[2]);
            this.string = string.replaceAll("random(.*)", RandomStringUtils.random(count, isAlpha, isNum));
        }
    }
    this.string = string.replaceAll("random(.*)", RandomStringUtils.random(3, isAlpha, isNum));
}
}

ТипRegistryImpl:

public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
    @Override
    public Locale locale() {
        return Locale.ENGLISH;
    }

    @Override
    public void configureTypeRegistry(TypeRegistry typeRegistry) {
        typeRegistry.defineParameterType(new ParameterType<>(
                "random",
                "random([0-9],true|false,true|false)",
                RandomString.class,
                RandomString::new)
        );
    }
}

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Я нашел решение после пробного использования, а также просмотрел несколько примеров из юнит-тестов в проекте cucumber-jvm.

Изменено StepDef :

@Given("user gets {random} parameter")
public void paramTest(String randomString) {
    System.out.println(randomString.string); 
}

Реализация TypeRegistryConfigurer:

import cucumber.api.TypeRegistry;
import cucumber.api.TypeRegistryConfigurer;
import io.cucumber.cucumberexpressions.CaptureGroupTransformer;
import io.cucumber.cucumberexpressions.ParameterType;
import org.apache.commons.lang3.RandomStringUtils;

import java.util.Locale;

public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
    @Override
    public Locale locale() {
        return Locale.ENGLISH;
    }

    @Override
    public void configureTypeRegistry(TypeRegistry typeRegistry) {
        typeRegistry.defineParameterType(new ParameterType<>(
                "random",
                "random\\(([0-9]+),(true|false),(true|false)\\)",
                String.class,
                new CaptureGroupTransformer<>() {
                    @Override
                    public String transform(String[] args) {
                        return RandomStringUtils.random(Integer.parseInt(args[0]), Boolean.valueOf(args[1]), Boolean.valueOf(args[2]));
                    }
                })
        );
    }
}
0 голосов
/ 04 марта 2019

Ваша строка random(3,true,true) не соответствует шаблону, используемому в:

typeRegistry.defineParameterType(new ParameterType<>(
        "random",
        "random([0-9],true|false,true|false)", 
        RandomString.class,
        RandomString::new)
);

Вы можете проверить это, создав шаблон и протестировав его:

import java.util.regex.Pattern;

class Scratch {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("random([0-9],true|false,true|false)");
        // prints out false
        System.out.println(pattern.matcher("random(3,true,true)").matches());
    }
}

У вас также нетиспользовал соответствующий шаблон в RandomString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...