Cucumber-JVM 3 - io.cucumber.datatable.UndefinedDataTableTypeException - PullRequest
0 голосов
/ 09 июня 2018

Я обновил с Cucumber-JVM 2.4.0 до 3.0.2 в моем pom.xml, и DataTables начал выдавать это исключение:

io.cucumber.datatable.UndefinedDataTableTypeException: Невозможно преобразовать DataTableперечислить .Пожалуйста, зарегистрируйте DataTableType в TableEntryTransformer или TableRowTransformer для класса jcucumberng.steps.pojos.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
}

Есть ли новый способ использования DataTables в Cucumber-JVM v3.xx?

ОБНОВЛЕНИЕ: enter image description here

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Миграция с v2.xx на v3.xx для DataTable

Публикация моего ответа в качестве справки для тех, кто может столкнуться с тем же.Чтобы объявить об их выпуске, нажмите здесь .

Я решил поместить DataTableConfigurer.java в отдельную упаковку, чтобы она не смешивалась с моими отчётами: enter image description here

Исполнитель:

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

DataTableConfigurer:

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 (который, как оказалось, имел те же поля), поэтому я только что зарегистрировалсяэто снова на основе примера.

0 голосов
/ 09 июня 2018

Он был полностью обновлен.XStream был удален, поэтому предыдущий код не будет работать.

Вам потребуется добавить логику для преобразования данных и преобразования параметров.Обращайтесь к ним - https://github.com/cucumber/cucumber/tree/master/datatable и https://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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...