Преобразование таблицы данных огурца в карту

Я использую таблицы данных огурца. Я хочу преобразовать эту таблицу данных в карту, а не в список. Так что в основном, что если я использую строку заголовка в качестве ключа и строки данных в качестве значения для ключа. Как мне это сделать?

Позвольте мне поделиться 1 примером, чтобы быть более ясным.

Даны следующие животные:

  | Type  | BabyAnimal |    
  | cow   | Calf       |
  | horse | Pony       |
  | sheep | Lamb       |

Вместо создания List<List<String>> здесь лучше использовать List<Map<String,String>> Вот. Ключ карты должен содержать "Type" и "BabyAnimal", а значения должны содержать соответствующие значения. Таким образом, объекты карты будут:

<Type,cow>,<BabyAnimal,Calf>
<Type,horse>,<BabyAnimal,Pony>
<Type,sheep>,<BabyAnimal,Lamb>

Как бы мы это сделали? Я чувствую, что это лучший подход, потому что мы получаем данные из ключей. например List(1).Map.get(Type)Принимая во внимание, что в случае List мы должны были бы сделать get(0), get(1), и есть вероятность использования неверных данных.

5 ответов

И добавление второго ответа, потому что общие типы в вашем вопросе смешались с 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);
}

Затем таблица будет автоматически преобразована в список отображений строки в строку.

Возможно, API изменился с тех пор, как этот вопрос был впервые опубликован. Я использую огурец версии 4.8.1, и этот код дает то, что вам нужно, без громоздких списков карт.

Map<String, String> map = dataTable.asMap(String.class, String.class);

В Cucumber 3.0.2 просто вызовите asMaps() из DataTable.

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

Как уже упоминалось в ответе Марит, если вы работаете с версией v3 и выше, вам придется работать немного больше. Вместо того, чтобы возвращать список карт, вы можете получить пользовательский объект, который содержит список карт.

Обратитесь к этому, чтобы узнать о классе конфигурации, чтобы упомянуть все преобразования с датированными данными - /questions/45031182/cucumber-jvm-3-iocucumberdatatableundefineddatatabletypeexception/45031209#45031209

Поместите этот кусочек кода в этот класс.

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 = лошадь, babyanimal= пони}, {type= овца, babyanimal= ягненок}, {type= корова, babyanimal= теленок}]

Вы можете найти следующую подсказку DataTable в проекте cucumber-jvm на GitHub:

        "    // 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";

Вы можете найти, как в документации по огурцам:

Самый простой способ передать список в определение шага - использовать таблицу данных:

Given the following animals:
  | cow   |
  | horse |
  | sheep |

Объявите аргумент как список, но не определяйте никаких групп захвата в выражении:

@Given("the following animals:")
public void the_following_animals(List<String> animals) {
}

В вашем случае замените List с Map,

Даны следующие животные:

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

Затем таблица будет преобразована в карту животного типа для детского животного.

Другие вопросы по тегам