将黄瓜数据表转换为地图

时间:2018-06-18 10:28:56

标签: cucumber-java

我正在使用黄瓜数据表。我想将此数据表转换为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)并且有可能使用不正确的数据。

6 个答案:

答案 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";

您可以在Cucumber documentation

中找到

将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);
}

然后表格将自动转换为字符串映射列表。