How to pass custom data type to cucumber-jvm stepdef in latest 4.x version

Mrunal Gosar :

I have recently upgraded to latest 4.x version of cucumber-jvm in my project in order to leverage parallel execution feature of cucumber. But I am facing this issue now with respect to having custom data type as parameter. Earlier we had an interface called Transformer which we can implement for custom data types, now in the latest version I've found TypeRegistryConfigurer interface which needs to be implemented. But it is not recognising the step as I would've expected. Details as follows:

Gherkin Step:

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

StepDefinition:

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

RandomString class:

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

TypeRegistryImpl:

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)
        );
    }
}
Mrunal Gosar :

I've found the solution after trial and hit and going through some examples from some Unit Tests in cucumber-jvm project.

Modified StepDef:

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

TypeRegistryConfigurer Implementation:

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=93264&siteId=1