首页 > 解决方案 > Cucumber-JVM 3 - io.cucumber.datatable.UndefinedDataTableTypeException

问题描述

我在我的pom.xml和 DataTables 中从 Cucumber-JVM 2.4.0 更新到 3.0.2 开始抛出这个异常:

io.cucumber.datatable.UndefinedDataTableTypeException:无法将 DataTable 转换为 List<jcucumberng.steps.pojos.Income>。请使用 jcucumberng.steps.pojos.Income 类的 TableEntryTransformer 或 TableRowTransformer 注册 DataTableType

我将所有导入更改为

import io.cucumber.datatable.DataTable;

我做了一个mvn clean install并且编译成功,但涉及 DataTables 的步骤在更新后不再起作用。

当前代码:

// Feature
When I Enter My Regular Income Sources
  | name   | amount | frequency     |
  | Salary | 25000  | every 2 weeks |


// Stepdef
@When("^I Enter My Regular Income Sources$")
public void I_Enter_My_Regular_Income_Sources(DataTable dataTable) throws Throwable {
    List<Income> incomes = dataTable.asList(Income.class);

    // More code    
}


// Custom type
public class Income {

    private String name = null;
    private String amount = null;
    private String frequency = null;

    public Income(String name, String amount, String frequency) {
        this.name = name;
        this.amount = amount;
        this.frequency = frequency;
    }

    // Getters and setters
}

在 Cucumber-JVM v3.xx 中是否有使用 DataTables 的新方法?

更新: 在此处输入图像描述

标签: javadatatablecucumbercucumber-jvm

解决方案


它已被彻底改造。XStream 已被删除,因此早期的代码将无法工作。

您将需要为数据表和参数转换添加逻辑。请参阅这些 - https://github.com/cucumber/cucumber/tree/master/datatablehttps://github.com/cucumber/cucumber/tree/master/cucumber-expressions。将下面的类代码放在胶水选项中定义的包内。

public class Configurer implements TypeRegistryConfigurer {

    @Override
            public void configureTypeRegistry(TypeRegistry registry) {

    registry.defineDataTableType(new DataTableType(Income.class, new TableEntryTransformer<Income>() {
                    @Override
                    public Income transform(Map<String, String> entry) {
                        return new Income(entry.get("name"),entry.get("amount"),entry.get("frequency"));
                    }
                }));
            }

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

        }

更新的进口......并非全部都是必需的,保留相关的

import cucumber.api.TypeRegistry;
import cucumber.api.TypeRegistryConfigurer;
import io.cucumber.cucumberexpressions.ParameterType;
import io.cucumber.datatable.DataTable;
import io.cucumber.datatable.DataTableType;
import io.cucumber.datatable.TableCellTransformer;
import io.cucumber.datatable.TableEntryTransformer;
import io.cucumber.datatable.TableRowTransformer;
import io.cucumber.datatable.TableTransformer;

推荐阅读