Cucumber-JVM 3 - io.cucumber.datatable.UndefinedDataTableTypeException

问题描述 投票:4回答:2

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

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

我把所有的进口都改成了

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.x.x中使用DataTables的新方法?

更新:enter image description here

java datatable cucumber cucumber-jvm
2个回答
6
投票

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

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

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;

2
投票

对于DataTable,从v2.x.x迁移到v3.x.x.

发布我的答案,作为可能遇到同样的人的参考。如需发布公告,请单击here

我决定把DataTableConfigurer.java放在自己的包中,所以它不会与我的stepdef混合:enter image description here

亚军:

@CucumberOptions(features = { "src/test/resources/features" }, tags = { "not @ignore" }, glue = {
        "jcucumberng/steps/defs", "jcucumberng/steps/config", "jcucumberng/steps/hooks" }, ...

Datatableonfigurer

import java.util.Locale;
import java.util.Map;

import cucumber.api.TypeRegistry;
import cucumber.api.TypeRegistryConfigurer;
import io.cucumber.datatable.DataTableType;
import io.cucumber.datatable.TableEntryTransformer;
import jcucumberng.steps.domain.Expense;
import jcucumberng.steps.domain.Income;

/*
 * Maps datatables in feature files to custom domain objects.
 */
public class DataTableConfigurer implements TypeRegistryConfigurer {

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

    @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"));
            }
        }));

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

}

我有另一个自定义域类型Expense(碰巧有相同的字段),所以我只是根据示例再次注册它。

© www.soinside.com 2019 - 2024. All rights reserved.