Несоответствие Arity с таблицами данных Java Cucumber - PullRequest
0 голосов
/ 08 июня 2018

Я изучаю Cucumber for Java, используя Отличный блог Якуба Чечотки .Но он потерял меня при описании таблиц данных.
Я создал класс калькулятора с сложением, вычитанием, умножением и делением.Индивидуальные тесты каждого из этих методов проходят.Когда я пытаюсь использовать таблицу, я получаю ошибку несоответствия арности от Gherkin:

cucumber.runtime.CucumberException: Arity mismatch: Step Definition 'com.test.bdd.steps.CalculatorSteps.iWantToPerformADataTableCalculation(DataTable) in file: .../Code/Java/CucumberTest/target/test-classes/' with pattern [^I want to perform a data table calculation$] is declared with 1 parameters. However, the gherkin step has 0 arguments [].

Вот соответствующие файлы и пути:

src/main/java/com/test/bdd/calculator/
package com.test.bdd.calculator;
public class Calculator
{

    private int result;
    public void divide( int a, int b )
    {
        result = a / b;
    }
    public int getResult()
    {
        return result;
    }
}


src/test/resources/cucumber/
  Scenario: Division
    Given I want to perform a calculation
    When I divide 14 by 2
    Then the result should be 7

  Scenario Outline: Division Data Table
    Given I want to perform a data table calculation
    When I divide <Numerator> by <Divisor>
    Then the result should be <Result>
    Examples:
      | Numerator | Divisor | Result |
      | 100       | 2       | 50     |
      | 100       | 4       | 25     |
      | 1000      | 200     | 5      |


src/test/java/com/test/bdd/steps/
package com.test.bdd.steps;
public class CalculatorSteps
{
    private Calculator calculator;
    @Before
    public void setUp()
    {
        calculator = new Calculator();
    }

    @When( "^I divide <Numerator> by <Divisor>$" )
    public void iDivideNumeratorByDivisor()
    {
        // Write code here that turns the phrase above into concrete actions
        calculator.divide( 4, 3 );
    }


    @Then( "^the result should be <Result>$" )
    public void theResultShouldBeResult()
    {
        // Write code here that turns the phrase above into concrete actions
        assertEquals( 1, calculator.getResult() );
    }


    @Given( "^I want to perform a data table calculation$" )
    public void iWantToPerformADataTableCalculation( DataTable table )
    {
        if( table != null )
        {
            for ( Map<String, Integer> map : table.asMaps( String.class, Integer.class ) )
            {
                Integer numerator = map.get( "Numerator" );
                Integer divisor = map.get( "Divisor" );
                Integer result = map.get( "Result" );
                System.out.println( format( "Dividing %d by %d yields %d", numerator, divisor, result ) );
            }
        }
    }
}


package com.test.bdd.runner;
@RunWith( Cucumber.class )
@CucumberOptions(
    glue = "com.test.bdd.steps",
    features = "classpath:cucumber/calculator.feature" )


public class RunCalculatorTests
{
}

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

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

ArityMismatch означает, что вы не передаете правильное количество параметров.Например:

@When( "^I divide <Numerator> by <Divisor>$" )
public void iDivideNumeratorByDivisor()
{

Шаг использует 2 параметра (числитель и делитель), но метод не определяет эти параметры.

Вместо этого используйте что-то вроде этого: @When ("^ Iделить на $ ") public void iDivideNumeratorByDivisor (int num, int div) {

0 голосов
/ 08 июня 2018

В этом файле сценария отсутствует DataTable для этого шага сценария.Не требуется добавлять аргумент DataTable к этому определению шага.

Этот пример, кажется, подчеркивает использование ScenarioOutline, а не DataTable.

ScenarioOutline определяет набор шагов, до сих пор похожих на сценарий.Теперь эти шаги можно выполнить повторно, используя данные из таблицы примеров.Каждая строка этой таблицы соответствует одному выполнению описанных шагов.Таким образом, если у вас 3 строки, будет 3 прогона.

С другой стороны, DataTable используется для отправки данных в виде своего рода списка на конкретный этап сценария.Как, может быть, список покупок.Это выполняется только один раз.Хотя он также может использоваться в ScenarioOutline, что позволяет использовать списки переменных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...