我正在使用黄瓜数据表。我想将此数据表转换为Map而不是列表。 所以基本上如果我使用Header Row作为Key而数据行作为键的值。 我该怎么做?
让我分享一个更清楚的例子。
鉴于以下动物:
| Type | BabyAnimal |
| cow | Calf |
| horse | Pony |
| sheep | Lamb |
在此处使用List<List<String>>
是一种更好的方法,而不是在此处创建List<Map<String,String>>
。
地图的密钥应包含&#39;类型&#39;和&#39; BabyAnimal&#39;和值应包含相应的值。
所以Map实体将是:
<Type,cow>,<BabyAnimal,Calf>
<Type,horse>,<BabyAnimal,Pony>
<Type,sheep>,<BabyAnimal,Lamb>
我们怎么做?
我觉得这是一种更好的方法,因为我们从键中获取数据。
例如List(1).Map.get(Type)
而在List的情况下,我们必须做get(0),get(1)并且有可能使用不正确的数据。
答案 0 :(得分:1)
在Cucumber 3.0.2中,只需从DataTable中调用asMaps()。
public void feature_step(DataTable dataTable) {
List<Map<String, String>> data = dataTable.asMaps();
String type = data.get(0).get("Type");
Strig babyAnimal = data.get(0).get("BabyAnimal");
}
答案 1 :(得分:1)
也许自该问题首次发布以来,API一直在发展。我使用的是黄瓜版本4.8.1,此代码无需复杂的地图列表即可满足您的需求
Map<String, String> map = dataTable.asMap(String.class, String.class);
答案 2 :(得分:0)
您可以在cucumber-jvm project on GitHub:
中找到以下DataTable提示 " // For automatic transformation, change DataTable to one of\n" +
" // E, List<E>, List<List<E>>, List<Map<K,V>>, Map<K,V> or\n" +
" // Map<K, List<V>>. E,K,V must be a String, Integer, Float,\n" +
" // Double, Byte, Short, Long, BigInteger or BigDecimal.\n" +
" //\n" +
" // For other transformations you can register a DataTableType.\n";
中找到
将List传递给步骤定义的最简单方法是使用数据表:
Given the following animals:
| cow |
| horse |
| sheep |
将参数声明为List,但不要在表达式中定义任何捕获组:
@Given("the following animals:")
public void the_following_animals(List<String> animals) {
}
在您的情况下,请将List
替换为Map
。
答案 3 :(得分:0)
如Marit的回答所述,如果您使用的是v3 plus,则需要做更多的工作。您可以取回包含地图列表的自定义对象,而不是取回地图列表。
请参阅此文件以找出配置类,以提及所有数据表转换-Cucumber-JVM - io.cucumber.datatable.UndefinedDataTableTypeException
将这段代码放入此类。
registry.defineDataTableType(new DataTableType(Animals.class, new TableTransformer<Animals>() {
@Override
public Animals transform(DataTable table) throws Throwable {
Animals animals = new Animals();
table.asMaps().forEach(e -> animals.addAnimal(e));
return animals;
}
}));
这是容器或数据对象类。
public class Animals {
public static final String type = "type";
public static final String baby = "babyanimal";
private List<Map<String, String>> details = new ArrayList<>();
public void addAnimal(Map<String, String> entry) {
details.add(entry);
}
public List<Map<String, String>> getDetails() {
return details;
}
@Override
public String toString() {
return "Animals [details=" + details + "]";
}
}
步骤定义
@Given("all baby animal details")
public void allMapDetails(Animals anim) {
System.out.println(anim.getDetails());
}
您应该得到这样的东西-
[{type = horse,babyanimal = Pony},{type = sheep,babyanimal = Lamb}, {type = cow,babyanimal = Calf}]
答案 4 :(得分:0)
给出以下动物:
| Type | BabyAnimal |
| cow | Calf |
| horse | Pony |
| sheep | Lamb |
并假设您希望将其作为步骤定义:
@Given("all baby animal details")
public void allMapDetails(Map<Type,BabyAnimal> animals) {
System.out.println(animals);
}
定义以下参数类型时:
public class ParameterTypes implements TypeRegistryConfigurer {
@Override
public Locale locale() {
return ENGLISH;
}
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
typeRegistry.defineDataTableType(new DataTableType(
Type.class,
(Map<String, String> row) -> new Type(row.get("Type"))
));
typeRegistry.defineDataTableType(new DataTableType(
BabyAnimal.class,
(Map<String, String> row) -> new BabyAnimal(row.get("BabyAnimal"))
));
}
}
然后,表格将被转换为动物类型的地图,成为小动物。
答案 5 :(得分:0)
并添加第二个答案,因为您的问题中的通用类型被html压缩了。
给出以下动物:
| Type | BabyAnimal |
| cow | Calf |
| horse | Pony |
| sheep | Lamb |
并假设您希望将其作为步骤定义:
@Given("all baby animal details")
public void allMapDetails(List<Map<String, String>> animals) {
System.out.println(animals);
}
然后表格将自动转换为字符串映射列表。