如何创建可通过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,步骤如下:
- 创建
DataTableTypeRegistry实例,它会自动注册默认转换器:
DataTableTypeRegistry registry = new DataTableTypeRegistry(Locale.ENGLISH);
- 通过注册表的
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>>的示例:
- 实现自定义转换器:
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()); } }
- 注册转换器并生成可用的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
相关产品推荐
相关产品推荐

