You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可通过asMaps转换的Cucumber DataTable(非步骤生成)

问题

我有一个通过Cucumber步骤定义生成DataTable的方法,步骤描述如下:

Some step description
 | Role | Name |
 | a1   | x1   |

方法内部将DataTable解析为指定格式:

@AND("Some step description")
public void someStep(DataTable dataTable) {
  ...
  List<Map<String, String>> roles = dataTable.asMaps(String.class, String.class);
  ...
}

现在我需要直接调用该方法而非通过步骤触发,因此需要手动创建DataTable传入。尝试用DataTable.create(List<List<String>> raw)创建后,调用asMaps方法报错:

Can't convert DataTable to List<Map<class java.lang.String,class java.lang.String>>. DataTable was created without a converter

已尝试操作:

  • 使用DataTable.create(List<List<String>> raw)创建DataTable
  • 查找自定义表格转换器示例

请问是否存在无需自定义转换器即可创建DataTable的方式?或者能否提供自定义转换器的示例?

解决方案

无需自定义转换器的创建方式

Cucumber的DataTable.create仅传原始列表时,不会绑定默认转换器。你可以通过DataTableTypeRegistry创建带有默认转换器的DataTable,步骤如下:

  1. 创建DataTableTypeRegistry实例,它会自动注册默认转换器:
DataTableTypeRegistry registry = new DataTableTypeRegistry(Locale.ENGLISH);
  1. 通过注册表的dataTableConverter生成DataTable:
List<List<String>> rawData = Arrays.asList(
    Arrays.asList("Role", "Name"),
    Arrays.asList("a1", "x1")
);

DataTable dataTable = registry.dataTableConverter().toDataTable(rawData);

这样生成的DataTable就能正常调用asMaps(String.class, String.class)方法。

自定义转换器示例

如果需要自定义转换逻辑,可以实现TableTransformer接口,以下是针对List<Map<String,String>>的示例:

  1. 实现自定义转换器:
import io.cucumber.datatable.TableTransformer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class CustomTableTransformer implements TableTransformer<List<Map<String, String>>> {
    @Override
    public List<Map<String, String>> transform(DataTable table) {
        List<String> headers = table.topCells();
        return table.cells().stream()
            .skip(1) // 跳过表头行
            .map(row -> {
                Map<String, String> map = new HashMap<>();
                for (int i = 0; i < headers.size(); i++) {
                    map.put(headers.get(i), row.get(i));
                }
                return map;
            })
            .collect(Collectors.toList());
    }
}
  1. 注册转换器并生成可用的DataTable:
import io.cucumber.datatable.DataTable;
import io.cucumber.datatable.DataTableTypeRegistry;
import java.util.Arrays;
import java.util.List;

// 创建注册表并注册自定义转换器
DataTableTypeRegistry registry = new DataTableTypeRegistry(Locale.ENGLISH);
registry.defineTableTransformer(new CustomTableTransformer());

// 构造原始数据并生成DataTable
List<List<String>> rawData = Arrays.asList(
    Arrays.asList("Role", "Name"),
    Arrays.asList("a1", "x1")
);
DataTable dataTable = registry.dataTableConverter().toDataTable(rawData);

// 直接转换(或传入目标方法自动触发转换)
List<Map<String, String>> roles = dataTable.convert(List.class, new com.fasterxml.jackson.core.type.TypeReference<List<Map<String, String>>>() {});

内容的提问来源于stack exchange,提问作者Dmitry Smollett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:51:12