功能文件:功能:Cucumber可以将小黄瓜表转换为地图
场景:国际咖啡店必须处理货币
给定国际咖啡店的价目表
| product | currency | price |
| coffee | EUR | 1 |
| donut | SEK | 18 |
当我买1杯咖啡和1个甜甜圈时
那么我应该支付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);
}
}
io.cucumber.core.exception.CucumberException:无法转换参数对于步骤[^国际咖啡店的价目表$],定义于你好。StepDefs_PriceList.the_price_list_for_an_international_coffee_shop(java.util.list('。您似乎没有注册数据表类型。详细信息请参阅下面的堆叠跑道。
<cucumber.version>5.4.1</cucumber.version> <junit.version>4.13</junit.version>
我是黄瓜专业的大三学生。你能解释一下代码中到底需要更改什么吗
这个错误看起来是因为新的cucumber版本5,但还不清楚如何使其工作
谢谢。
我假设您正在从v1.x升级到v5.x。
在v1.x中,Cucumber会自动将数据表转换为POJO。这是由XStream内部处理的。不幸的是,这导致了Cucumber和XStream之间的紧密耦合。
相反,如果您想将数据表转换为POJO,现在必须提供自己的对象映射器。您可以为所有转换注册一个,如下所示:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;
import io.cucumber.java.DefaultDataTableCellTransformer;
import io.cucumber.java.DefaultDataTableEntryTransformer;
import io.cucumber.java.DefaultParameterTransformer;
import java.lang.reflect.Type;
public class StepDefinitions {
private final ObjectMapper objectMapper =
new ObjectMapper().registerModule(new JSR310Module());
@DefaultParameterTransformer
@DefaultDataTableEntryTransformer
@DefaultDataTableCellTransformer
public Object defaultTransformer(Object fromValue, Type toValueType) {
JavaType javaType = objectMapper.constructType(toValueType);
return objectMapper.convertValue(fromValue, javaType);
}
}
注意:我们在本例中使用jackson-databind
。它的工作方式与Cucumbers与XStream的集成方式不同,但它应该足以满足大多数用例的要求。
您还可以为特定的java类型进行数据表转换:
Given some authors
| name | first publication |
| Aspiring Author | |
| Ancient Author | [blank] |
package com.example.app;
import io.cucumber.java.DataTableType;
import io.cucumber.java.en.Given;
import java.util.List;
public class StepDefinitions {
@DataTableType(replaceWithEmptyString = "[blank]")
public Author convert(Map<String, String> entry){
return new Author(
entry.get("name"),
entry.get("first publication")
);
}
@Given("some authors")
public void given_some_authors(List<Author> authors){
// authors = [Author(name="Aspiring Author", firstPublication=null),
// Author(name="Ancient Author", firstPublication=)]
}
}