簡體   English   中英

黃瓜-JVM 3 - io.cucumber.datatable.UndefinedDataTableTypeException

[英]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 的新方法?

更新: 在此處輸入圖片說明

它已被徹底改造。 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;

DataTable 從 v2.xx 遷移到 v3.xx

貼出我的回答,供遇到同樣情況的人參考。 對於他們的發布公告,請單擊此處

我決定將DataTableConfigurer.java放在它自己的包中,這樣它就不會與我的 stepdef 混合: 在此處輸入圖片說明

賽跑者:

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

數據表配置器:

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 (碰巧有相同的字段),所以我只是根據示例再次注冊了它。

使用 DataTableType 注解

@DataTableType
public Income incomeEntry(Map<String, String> entry) {
    return new Income(entry.get("name"), entry.get("amount"), entry.get("frequency"));
}

然后就可以直接使用步驟定義中自定義類的列表

@When("^I Enter My Regular Income Sources$")
public void I_Enter_My_Regular_Income_Sources(List<Income> incomes) throws Throwable {
    // More code    
}
    I have created a code which won't use **DataTable** concept. You can update this below implementation so that you won't get any failures in your scripts in future.

    CucumberUtil.java:
    -----------------
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    public class CucumberUtil {

// public static synchronized Map<String, String> TableDictionaryConverter(DataTable table) {                    -- removed this concept because of version issues in DataTable
   public static synchronized Map<String, String> TableDictionaryConverter(List<List<String>> data) {
          Map<String, String> mapTable = new HashMap<String, String>();
          for(List<String> rows: data) {
                 mapTable.put(rows.get(0), rows.get(1)); 
          }
          return mapTable;
   }

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

// Stepdef
@When("^I Enter My Regular Income Sources$")
public void I_Enter_My_Regular_Income_Sources(List<List<String>> table) throws Throwable {

    Map<String, String> mapTable = CucumberUtil.TableDictionaryConverter(table);

    String nameValue = mapTable.get("name");         // Salary
    String amountValue = mapTable.get("name");       // 25000
    String frequencyValue = mapTable.get("name");    // every 2 weeks

    // More code    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM