如何在Cucumber 4.0中通过类型注册表添加数据表

asi*_*nha 0 cucumber cucumber-java

对于黄瓜 3.0 我正在使用

typeRegistry.defineDataTableType(DataTableType.entry(CustomData.class));

public class CustomData {
    private int id;
    private int val;
    private Region region;
    private Boolean isExisting;
    private String type;

  //getter and setter methods
 }
Run Code Online (Sandbox Code Playgroud)

如何在 Cucumber 4.0.0 中将其转换为 configureTypeRegistry 的一部分

我在特征文件中的步骤为

 When I set the custom data
  | region | id | val | isExisting | type  |
  | NA     | 2  | 10  | true       | custom|
Run Code Online (Sandbox Code Playgroud)

mpk*_*nje 5

有几种方法可以做到。对于#2 和#3,您必须向项目添加依赖项jackson-databind

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

import java.util.Map;

class TypeRegistryConfiguration implements TypeRegistryConfigurer {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void configureTypeRegistry(TypeRegistry typeRegistry) {

        // 1. Define the mapping yourself.
        typeRegistry.defineDataTableType(
                new DataTableType(MyType.class,
                        (Map<String, String> entry) -> {
                            MyType object = new MyType();
                            object.setX(entry.get("X"));
                            return object;
                        }
                )
        );

        // 2. Define a data table type that delegates to an object mapper
        typeRegistry.defineDataTableType(
                new DataTableType(MyType.class,
                        (Map<String, String> entry) -> objectMapper.convertValue(entry, MyType.class)
                )
        );


        // 3. Define a default data table entry that takes care of all mappings
        typeRegistry.setDefaultDataTableEntryTransformer(
                (entryValue, toValueType, cellTransformer) ->
                        objectMapper.convertValue(entryValue, objectMapper.constructType(toValueType)));
    }
}
Run Code Online (Sandbox Code Playgroud)

在 v5 中,你会这样做:

import com.fasterxml.jackson.databind.ObjectMapper;
import io.cucumber.java.DataTableType;
import io.cucumber.java.DefaultDataTableEntryTransformer;

import java.lang.reflect.Type;
import java.util.Map;

class TypeRegistryConfiguration {

    private final ObjectMapper objectMapper = new ObjectMapper();

    // 1. Define the mapping yourself
    @DataTableType
    public MyType myType(Map<String, String> entry) {
        MyType object = new MyType();
        object.setX(entry.get("X"));
        return object;
    }

    // 2. Define a data table type that delegates to an object mapper
    @DataTableType
    public MyType myType(Map<String, String> entry) {
        return objectMapper.convertValue(entry, MyType.class);
    }

    // 3. Define a default data table entry that takes care of all mappings
    @DefaultDataTableEntryTransformer
    public Object defaultDataTableEntry(Map<String, String> entry, Type toValueType) {
        return objectMapper.convertValue(entry, objectMapper.constructType(toValueType));
    }
}
Run Code Online (Sandbox Code Playgroud)