mo12345
mo12345

Reputation: 11

Is there a way to pass list of enums to step in cucumber 4.x and java

let's say I have example enum class

public enum Name { FIRST_NAME, LAST_NAME;}

and I have a such step

 Then followed name types are listed:
      | FIRST_NAME |
      | LAST_NAME  |

in which I want to pass List like

  @Then("^followed name types are listed:$")
  public void followedNameTypesAreListed(List<Name> nameTypes){...}

I'm currently migrating to cucumber 4.x and what i figured out is that i can register custom DataTableType like

typreRegistry.defineDataTableType(new DataTableType(Name.class,
        (TableCellTransformer<Name>) Name::valueOf)

but doing it for every single enum class doesn't sound very efficient, isn't there any other way to handle list for any enum class?

Upvotes: 1

Views: 1930

Answers (1)

M.P. Korstanje
M.P. Korstanje

Reputation: 12039

One quick way to do this would be to us an object mapper as the default cell transformer. The object mapper will then be used in all situations where a cell is mapped to a single object and no existing data table type has been defined.

You could use jackson-databind for this.

In Cucumber v4:

package com.example.app;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.cucumber.core.api.TypeRegistry;
import io.cucumber.core.api.TypeRegistryConfigurer;

import java.util.Locale;

public class ParameterTypes implements TypeRegistryConfigurer {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public Locale locale() {
        return Locale.ENGLISH;
    }

    @Override
    public void configureTypeRegistry(TypeRegistry typeRegistry) {
        typeRegistry.setDefaultDataTableCellTransformer(objectMapper::convertValue);
    }
}

And in v5:

package com.example.app;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.cucumber.java.DefaultDataTableCellTransformer;

import java.lang.reflect.Type;

public class DataTableSteps {

   private final ObjectMapper objectMapper = new ObjectMapper();

   @DefaultDataTableCellTransformer
   public Object defaultTransformer(Object fromValue, Type toValueType) {
       return objectMapper.convertValue(fromValue, objectMapper.constructType(toValueType));
   }
}

Upvotes: 1

Related Questions