Преобразование таблицы данных огурца в карту
Я использую таблицы данных огурца. Я хочу преобразовать эту таблицу данных в карту, а не в список. Так что в основном, что если я использую строку заголовка в качестве ключа и строки данных в качестве значения для ключа. Как мне это сделать?
Позвольте мне поделиться 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"))
));
}
}
Затем таблица будет преобразована в карту животного типа для детского животного.