Cucumber 7.3.4编程创建DataTable报无转换器错误如何解决
问题说明
- 运行环境:Cucumber 7.3.4(基于Gherkin语法)
- 实现目标:不在Gherkin文件中硬编码表格,通过代码传入两个字符串参数,调用
DataTable.create()生成单列表头+单行数据的两行结构DataTable
不使用的硬编码写法示例:
|status_code| | 200 |
- 对应业务步骤:
And expect result to be "status_code" and response "200",两个入参均为字符串类型 - 升级前可正常运行的旧实现代码:
public DataTable createDataTable(String columnName, String rowName) { List<List<String>> dataTableList = new ArrayList<>(); List<String> columns = Arrays.asList(columnName); List<String> rows = Arrays.asList(rowName); dataTableList.add(columns); dataTableList.add(rows); return DataTable.create(dataTableList); }
- 升级后异常:代码运行抛出
datatable was created without a converter错误,调试确认生成的DataTable实例内TableConverter属性为空,需要为编程方式创建的DataTable正确配置转换器。
解决方法
Cucumber 7.x版本调整了DataTable的创建逻辑,仅传入表格原始二维数据的create重载方法不会自动绑定内置的表格转换器,必须显式传入转换器实例才能正常使用表格的类型转换、数据读取能力。
- 通过Cucumber自带的依赖注入机制获取
TableConverter实例,不要手动实例化Cucumber内部转换器实现类,避免版本迭代中内部类变动导致的兼容性问题。无论使用PicoContainer、Spring、Guice还是Cucumber默认注入组件,都支持直接注入TableConverter类型的参数。 - 调整DataTable创建方法,使用带转换器参数的
create重载方法,代码示例如下:
import io.cucumber.datatable.DataTable; import io.cucumber.datatable.TableConverter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public DataTable createDataTable(String columnName, String rowName, TableConverter tableConverter) { List<List<String>> rawTable = new ArrayList<>(); rawTable.add(Arrays.asList(columnName)); rawTable.add(Arrays.asList(rowName)); return DataTable.create(rawTable, tableConverter); }
- 调用该方法时,直接传入Cucumber注入的
TableConverter实例即可,生成的DataTable可正常调用asMap()、asLists()、cells()等所有内置方法,不会再抛出无转换器的异常。
补充说明:如果仅需要读取原始单元格字符串值、不需要做复杂类型转换,也可以在创建完无转换器的DataTable实例后,调用
setConverter(TableConverter converter)方法手动绑定注入的转换器实例,效果和使用带参create方法一致。
内容的提问来源于stack exchange,提问作者Kirill MIlititskiy
相关产品推荐
相关产品推荐

