Анализ целочисленного списка из примера таблицы набросков сценария в огурце Java - PullRequest
1 голос
/ 24 марта 2019

Я должен написать тест BDD, используя cucumber с java, и я хотел бы проанализировать список целых чисел из каждой строки моей таблицы примеров и передать этот список моему методу step, используя последнюю версию cucumber (4.2.6).Итак, я получил следующее определение шага в моем файле функций:

Scenario Outline: Some scenarion
    Given a list of integer: <integer_list> 

    Examples:
      | integer_list   |
      | 2, 3, 5, 6     | 
      | 3, 12, 45, 5, 6| 

И мне нужно что-то подобное в моем коде:

   @Given("a list of integer: (\\d+.)")
    public void storeIntegerList(List<Integer> integers) {
     System.out.println(integers.size());
    }

К сожалению, я не могу найти способобработать парсинг этих значений в список.Он либо не находит метод step (я пробовал много разных регулярных выражений), либо выдает исключение, в котором сообщается, что мои числа не могут быть преобразованы в список.

В качестве обходного пути я анализирую список как строку, а затем разделяю его.Однако я не могу себе представить, что в 2019 году нет лучшего способа сделать это.

Обходной путь:

Scenario Outline: Some scenarion
    Given a list of integer: "<integer_list>" 

    Examples:
      | integer_list   |
      | 2, 3, 5, 6     | 
      | 3, 12, 45, 5, 6| 


@Given("a list of integer: {string}")
    public void storeIntegerList(String integers) {
        List<String> integersAsString = Arrays.asList(integers.split(","));
        List<Integer> integerList = integersAsString.stream().map(s -> Integer.valueOf(s.trim())).collect(Collectors.toList());
        System.out.println(integerList.size());        
    }

1 Ответ

4 голосов
/ 24 марта 2019

Я сделал так, как @Grasshopper посоветовал и реализовал свой собственный TypeRegistryConfigurer и поместил его рядом с моим классом бегунов (чтобы быть на пути клея):

import cucumber.api.TypeRegistry;
import cucumber.api.TypeRegistryConfigurer;
import io.cucumber.cucumberexpressions.ParameterType;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;

import static java.util.Locale.ENGLISH;

public class TypeRegistryConfiguration implements TypeRegistryConfigurer {
    @Override
    public Locale locale() {
        return ENGLISH;
    }

    @Override
    public void configureTypeRegistry(TypeRegistry typeRegistry) {
        typeRegistry.defineParameterType(new ParameterType<>(
                "integerList",  //this name can be used in the step method
                "(-?[0-9]+(,\\s*-?[0-9]+)*)", //regexp to match to a comma separated integer list which can contain negative numbers and whitespaces as well
                List.class,  //the expected parameter type
                this::transform  // equivalent to (String s) -> this.transformer(s), this is the transformer method which will be used to create the desired step parameter 
        ));
    }

//transforms the string form to an integer list
    private List<Integer> transform(String integers) {
        List<String> integersAsString = Arrays.asList(integers.split(","));
        return integersAsString.stream().map(s -> Integer.valueOf(s.trim())).collect(Collectors.toList());
    }
}

После этого я могу сделать следующее в своем классе шагов:

   @Given("a list of integer: {integerList}")
    public void storeIntegerList(List<Integer> integers) {
     System.out.println(integers.size());
    }

И файл функции можно использовать так:

Scenario Outline: Some scenarion
    Given a list of integer: <integer_list> 

    Examples:
      | integer_list     |
      | 2, 3, 5, 6       | 
      | 3, -12, 45, -5, 6| 
...