Java io.cucumber.core.exception.CucumberException:无法转换参数…似乎您没有注册数据表类型

Java io.cucumber.core.exception.CucumberException:无法转换参数…似乎您没有注册数据表类型,java,intellij-idea,cucumber,Java,Intellij Idea,Cucumber,功能文件: 功能:Cucumber可以将小黄瓜表转换为地图。 场景:国际咖啡店必须处理货币 给一家国际咖啡店的价目表 | product | currency | price | | coffee | EUR | 1 | | donut | SEK | 18 | 当我买一杯咖啡和一个甜甜圈时 那么我应该付1欧元18瑞典克朗吗 代码中有一部分: @Given("^the price list for an international coffe

功能文件: 功能:Cucumber可以将小黄瓜表转换为地图。
场景:国际咖啡店必须处理货币
给一家国际咖啡店的价目表

  | product | currency | price |
  | coffee  | EUR      | 1     |
  | donut   | SEK      | 18    |
当我买一杯咖啡和一个甜甜圈时
那么我应该付1欧元18瑞典克朗吗 代码中有一部分:

@Given("^the price list for an international coffee shop$")
public void the_price_list_for_an_international_coffee_shop(List<Price> prices) throws Throwable {
    priceList = new HashMap<String, Price>();

    for (Price price : prices) {
        String key = price.getProduct();
        priceList.put(key, price);
    }
}
@给定(“^A国际咖啡店的价格表$”)
公共作废国际咖啡店的价目表(价目表)可丢弃{
priceList=newhashmap();
用于(价格:价格){
String key=price.getProduct();
价格表。放置(键、价格);
}
}
io.cucumber.core.exception.CucumberException:无法转换参数 步骤[^国际咖啡店$]的价目表定义如下: 'helloccumber.StepDefs_PriceList.国际咖啡店(java.util.list)的_price_列表'。 您似乎没有注册数据表类型。详情载于 在下面跟踪

    <cucumber.version>5.4.1</cucumber.version>
    <junit.version>4.13</junit.version>
5.4.1
4.13
我是黄瓜系的大三学生。您能解释一下代码中到底需要更改什么吗?
看起来这个错误是因为新的cucumber版本5造成的,但是如何使它工作还不清楚。

谢谢。

我假设您正在从v1.x升级到v5.x

在v1.x中,Cucumber将自动将数据表转换为POJO。这是由XStream内部处理的。不幸的是,这导致Cucumber和XStream之间的紧密耦合

相反,如果要将数据表转换为POJO,现在必须提供自己的对象映射器。您可以为所有转换注册一个,如下所示:

import com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.datatype.jsr310.jsr310模块;
导入io.cumber.java.DefaultDataTableCellTransformer;
导入io.cucumber.java.DefaultDataTableEntryTransformer;
导入io.cumber.java.DefaultParameterTransformer;
导入java.lang.reflect.Type;
公共类定义{
私有最终对象映射器对象映射器=
新的ObjectMapper().registerModule(新的JSR310Module());
@默认参数转换器
@DefaultDataTableEntryTransformer
@DefaultDataTableCellTransformer
公共对象defaultTransformer(对象从值、类型到值类型){
JavaType JavaType=objectMapper.constructType(toValueType);
返回objectMapper.convertValue(fromValue,javaType);
}
} 
注意:本例中使用的是
jackson数据绑定。它的工作方式与Cucumbers与XStream的集成方式并不完全相同,但它应该足以满足大多数用例

还可以针对特定java类型进行数据表转换:

Given some authors
   | name            | first publication |
   | Aspiring Author |                   |
   | Ancient Author  | [blank]           |
package com.example.app;
导入io.cumber.java.DataTableType;
导入io.cumber.java.en.Given;
导入java.util.List;
公共类定义{
@DataTableType(replaceWithEmptyString=“[blank]”)
公共作者转换(地图条目){
返回新作者(
entry.get(“name”),
entry.get(“第一次发布”)
);
}
@给定(“某些作者”)
某些作者(列出作者)的公共无效{
//作者=[作者(name=“有抱负的作者”,firstPublication=null),
//作者(姓名=“古代作者”,首次出版=)]
}
}