ExecuteAutomation

All new Cucumber-JVM 5 with its Cucumber Expression

In this post we will discuss all new cucumber 5 released couple of weeks before and its awesome new way to use Cucumber expression. Cucumber expressions released way back in Cucumber-JVM 3.0.0 With it came the ability to register parameter- and data table-types by implementing the TypeRegistryConfigurer.

The TypeRegistryConfigurer however is not part of the glue. This made it impossible to access the test context. With cucumber-java this is now possible by using the @ParameterType@DataTableType and @DocStringType annotations. This allows parameter-, data table- and docstring types to be mapped to objects which can only be created inside the test context.

Here is how the scenario looks like

  Scenario: Perform an misc operation
    Given I login as admin
      |username|password|
      |admin   |[blank] |
    And I have few books in hand such as java, js, csharp

@DataTableType

An replacement of TableEntryTransformer and TableCellTransformer and the code looks something like this

    @DataTableType(replaceWithEmptyString = "[blank]")
    public UserInfo convert(Map<String, String> entry) {
        return new UserInfo(
          entry.get("username"),
          entry.get("password").concat("@#$@#$@#@#$")
        );
    }

@ParameterType

Parameter type annotation will helps work with any parameters passed within the step definition

    @ParameterType("[^\"]*")
    public List<String> book(String bookName) {
        return Arrays.asList(bookName.split(","));
    }

And its step definition looks like this

    @And("I have few books in hand such as {book}")
    public void iHaveFewBooksInHandSuchAsJavaJsCsharp(List<String> books) {
        System.out.println(books.get(2));
    }

Please note the above {book} in the @And attribute in the step definition which calls the book method of the @ParameterType

@DocStringType

This is a new feature introduced in Cucumber 5 which does more magics which allow DocStrings in Steps to be transformed into an ObjectAll new

The DocString step looks something like this

    Given some more information
      """json
      {
         "Name": "Karthik",
         "Company": "ExecuteAutomation",
         "Living": "New Zealand"
      }
      """

And the implementation of this code looks like this

    @DocStringType
    public JsonNode json(String docString) throws JsonProcessingException {
        return objectMapper.readTree(docString);
    }

    @Given("some more information")
    public void someMoreInformation(JsonNode jsonNode) {
        var name = jsonNode.get("Name");
        var company = jsonNode.get("Company");
        System.out.println("Name " + name + ", Company " + company);
    }

Here is the complete video of the above discussion

Thanks for reading the article and watching the video !

Please leave your valuable comments on the post and video if you think there needs any improvement or I missed anything to add.

Thanks,

Karthik KK