Как решить ошибку step is undefined в Cucumber

#java #cucumber

#java #огурец

Вопрос:

У нас есть несколько пользовательских историй, и мы используем Cucumber-framework для их автоматического тестирования. Это наш feature файл:

 Feature: Gerechten selecteren en leveren
  Als koerier gerechten selecteren en leveren


  Scenario: update vragen opdrachten
    Given er is een lijst van bestellingen
    When De koerier met id 1 kiest een bestelling met id 1
    Then De koerier met id 1 heeft een actieve bestelling met id 1

  Scenario: Melding geven bestelling afgehaald is
    Given Er is een actieve bestelling met id 1 bij de koerier met id 1
    When Bestelling met id 1 is afgehaald door de koerier met id 1
    Then Bestelling met id 1 heeft status afgehaald

  Scenario: Melding geven bestelling geleverd is
    Given Er is een actieve bestelling met id 1 bij de koerier met id 1 met status afgehaald
    When Bestelling met id 1 wordt geleverd door koerier met id 1
    Then Bestelling met id 1 heeft status geleverd
    And De koerier met id 1 krijgt 10 punten
    And De koerier met id 1 zijn actieve bestelling met id 1 is verwijderd
    And De koerier met id 1 heeft 1 voltooide bestelling


  Scenario: puntentransacties raadplegen
    Given De koerier met id 1 heeft een account
    When De koerier met id 1 punten opvraagd
    Then Voor de koerier met id 1 worden er 10 punten getoond
  

Он состоит из нескольких сценариев с заданным-когда-то-формат.

Это наш test-code :

 package be.kdg.cucumber;

import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import org.junit.jupiter.api.BeforeEach;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertNotNull;


public class DeliDishStepDefs {
    private Bestellingen bestellingen;
    private Gerecht g1;
    private Gerecht g2;

    private Klant k1;
    private Klant k2;

    private Bestelling b1;
    private Bestelling b2;
    private Bestelling b3;

    private Koerier c1;

    int puntenKoerier;

    @BeforeEach
    void setUp() {
        bestellingen = new Bestellingen();

        g1 = new Gerecht(1,"pizza calzone", 12.99);
        g2 = new Gerecht(2,"spaghetti bolognaise", 12.99);

        k1 = new Klant(1, "Jan De Rijke","kerkstraat 7");
        k2 = new Klant(2, "Piet Boedt", "kerkstraat 7");

        b1 = new Bestelling(1, g1, k1);
        b2 = new Bestelling(2, g1, k2);
        b3 = new Bestelling(3, g2, k1);

        bestellingen.add(b1);
        bestellingen.add(b2);
        bestellingen.add(b3);

        c1 = new Koerier(1, "Bert Fransens");
    }

    @Given("er is een lijst van bestellingen")
    public void erIsEenLijstVanBestellingen() {
        assertNotNull(bestellingen, "Er moet een lijst zijn van bestellingen");
        int size = bestellingen.getSize();
        assertEquals(3, size, "Er moeten 3 bestellingen zitten in de lijst");
    }

    @When("De koerier met id {int} kiest een bestelling met id {int}")
    public void deKoerierMetIdKiestEenBestellingMetId(int arg0, int arg1) {
        if (c1.getId() == arg0) {
            if (b1.getId() == arg1) {
                c1.setActieveBestelling(b1);
            }
        }
    }

    @Then("De koerier met id {int} heeft een actieve bestelling met id {int}")
    public void deKoerierMetIdHeeftEenActieveBestellingMetId(int arg0, int arg1) {
        assertEquals(arg0, c1.getId(), "De id van de koerier moet "   arg0   " zijn");
        assertEquals(arg1, b1.getId(), "De id van de bestelling moet "   arg1   " zijn");
        assertNotNull(c1.getActieveBestelling(), "Er moet een actieve bestelling zijn");
    }

    @Given("Er is een actieve bestelling met id {int} bij de koerier met id {int}")
    public void erIsEenActieveBestellingMetIdBijDeKoerierMetId(int arg0, int arg1) {
        assertEquals(arg1, c1.getId(), "De id van de koerier moet "   arg1   " zijn");
        assertEquals(arg0, c1.getActieveBestelling().getId(), "De actieve bestelling van de koerier"   arg1   " moet als id "   arg0   " hebben");
        assertNotNull(c1.getActieveBestelling(), "Er moet een actieve bestelling zijn");
    }

    @When("Bestelling met id {int} is afgehaald door de koerier met id {int}")
    public void bestellingMetIdIsAfgehaaldDoorDeKoerierMetId(int arg0, int arg1) {
        if (c1.getId() == arg1) {
            if (b1.getId() == arg0) {
                c1.getActieveBestelling().setStatus(BestellingStatus.AFGEHAALD);
            }
        }
    }

    @Then("Bestelling met id {int} heeft status afgehaald")
    public void bestellingMetIdHeeftStatusAfgehaald(int arg0) {
        assertEquals(arg0, b1.getId(), "De id van de bestelling moet "   arg0   " zijn");
        assertEquals(c1.getActieveBestelling().getStatus(), BestellingStatus.AFGEHAALD, "De bestelling moet een status hebben van afgehaald");
    }

    @Given("Er is een actieve bestelling met id {int} bij de koerier met id {int} met status afgehaald")
    public void erIsEenActieveBestellingMetIdBijDeKoerierMetIdMetStatusAfgehaald(int arg0, int arg1) {
        assertEquals(arg1, c1.getId(), "De id van de koerier moet "   arg1   " zijn");
        assertEquals(arg0, c1.getActieveBestelling().getId(), "De actieve bestelling van de koerier"   arg1   " moet als id "   arg0   " hebben");
        assertNotNull(c1.getActieveBestelling(), "Er moet een actieve bestelling zijn");
        assertEquals(c1.getActieveBestelling().getStatus(), BestellingStatus.AFGEHAALD, "De bestelling moet afgehaald zijn");
    }

    @When("Bestelling met id {int} wordt geleverd door koerier met id {int}")
    public void bestellingMetIdWordtGeleverdDoorKoerierMetId(int arg0, int arg1) {
        if (c1.getId() == arg1) {
            if (b1.getId() == arg0) {
                c1.getActieveBestelling().setStatus(BestellingStatus.GELEVERD);
            }
        }
    }

    @Then("Bestelling met id {int} heeft status geleverd")
    public void bestellingMetIdHeeftStatusGeleverd(int arg0) {
        assertEquals(arg0, b1.getId(), "De id van de bestelling moet "   arg0   " zijn");
        assertEquals(c1.getActieveBestelling().getStatus(), BestellingStatus.GELEVERD, "De bestelling moet een status hebben van geleverd");
    }

    @And("De koerier met id {int} krijgt {int} punten")
    public void deKoerierMetIdKrijgtPunten(int arg0, int arg1) {
        if (c1. getId() == arg0) {
            c1.addPunten(arg1);
            c1.voltooiBestelling();
        }
    }

    @And("De koerier met id {int} zijn actieve bestelling met id {int} is verwijderd")
    public void deKoerierMetIdZijnActieveBestellingMetIdIsVerwijderd(int arg0, int arg1) {
        assertEquals(arg0, c1.getId(), "De id van de koerier moet "   arg0   " zijn");
        assertNull(c1.getActieveBestelling(), "De actieve bestelling met id "   arg1   " van koer met id "   arg0   " moet null zijn");
    }

    @And("De koerier met id {int} heeft {int} voltooide bestelling")
    public void deKoerierMetIdHeeftVoltooideBestelling(int arg0, int arg1) {
        assertEquals(arg0, c1.getId(), "De id van de koerier moet "   arg0   " zijn");
        int size = c1.getSizeBestellingen();
        assertEquals(arg1, size, "Het aantal voltooide bestellingen moet "   arg1   " zijn");
    }

    @Given("De koerier met id {int} heeft een account")
    public void deKoerierMetIdHeeftEenAccount(int arg0) {
        assertEquals(arg0, c1.getId(), "De koerier met deze id bestaat niet");
    }

    @When("De koerier met id {int} punten opvraagd")
    public void deKoerierMetIdPuntenOpvraagd(int arg0) {
        if (c1.getId() == arg0) {
            puntenKoerier = c1.getPunten();
        }
    }


    @Then("Voor de koerier met id {int} worden er {int} punten getoond")
    public void voorDeKoerierMetIdWordenErPuntenGetoond(int arg0, int arg1) {
        assertEquals(arg0, c1.getId(), "De id van de koerier moet "   arg0   " zijn");
        int aantalPunten = c1.getPunten();
        assertEquals(arg1, aantalPunten, "Het aantal punten van koerier met id "   arg0   " moet "   arg1   " zijn");
    }
}

  

Это ошибка, которую мы получаем:

 Testing started at 16:15 ...

> Task :compileJava UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources UP-TO-DATE
> Task :testClasses UP-TO-DATE
> Task :test FAILED
Feature: Gerechten selecteren en leveren
  Als koerier gerechten selecteren en leveren

  Scenario: update vragen opdrachten                               # src/test/resources/features/DeliDish.feature:5
    Given er is een lijst van bestellingen                         # null
    When De koerier met id 1 kiest een bestelling met id 1         # null
    Then De koerier met id 1 heeft een actieve bestelling met id 1 # null

Multiple Failures (3 failures)
    io.cucumber.junit.UndefinedThrowable: The step "er is een lijst van bestellingen" is undefined
    io.cucumber.junit.UndefinedThrowable: The step "De koerier met id 1 kiest een bestelling met id 1" is undefined
    io.cucumber.junit.UndefinedThrowable: The step "De koerier met id 1 heeft een actieve bestelling met id 1" is undefined
org.opentest4j.MultipleFailuresError: Multiple Failures (3 failures)
    io.cucumber.junit.UndefinedThrowable: The step "er is een lijst van bestellingen" is undefined
    io.cucumber.junit.UndefinedThrowable: The step "De koerier met id 1 kiest een bestelling met id 1" is undefined
    io.cucumber.junit.UndefinedThrowable: The step "De koerier met id 1 heeft een actieve bestelling met id 1" is undefined
    at org.junit.vintage.engine.execution.TestRun.getStoredResultOrSuccessful(TestRun.java:179)
    at org.junit.vintage.engine.execution.RunListenerAdapter.fireExecutionFinished(RunListenerAdapter.java:211)
    at org.junit.vintage.engine.execution.RunListenerAdapter.testFinished(RunListenerAdapter.java:177)
    at org.junit.vintage.engine.execution.RunListenerAdapter.testFinished(RunListenerAdapter.java:76)
    at org.junit.runner.notification.SynchronizedRunListener.testFinished(SynchronizedRunListener.java:56)
    at org.junit.runner.notification.RunNotifier$7.notifyListener(RunNotifier.java:190)
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72)
    at org.junit.runner.notification.RunNotifier.fireTestFinished(RunNotifier.java:187)
    at io.cucumber.junit.JUnitReporter$EachTestNotifier.fireTestFinished(JUnitReporter.java:253)
    at io.cucumber.junit.JUnitReporter.handleTestCaseResult(JUnitReporter.java:178)
    at io.cucumber.junit.JUnitReporter$4.receive(JUnitReporter.java:66)
    at io.cucumber.junit.JUnitReporter$4.receive(JUnitReporter.java:62)
    at cucumber.runner.AbstractEventPublisher.send(AbstractEventPublisher.java:45)
    at cucumber.runner.AbstractEventBus.send(AbstractEventBus.java:9)
    at cucumber.runner.ThreadLocalRunnerSupplier$LocalEventBus.send(ThreadLocalRunnerSupplier.java:60)
    at cucumber.runner.TestCase.run(TestCase.java:55)
    at cucumber.runner.Runner.runPickle(Runner.java:50)
    at io.cucumber.junit.PickleRunners$NoStepDescriptions.run(PickleRunners.java:146)
    at io.cucumber.junit.FeatureRunner.runChild(FeatureRunner.java:68)
    at io.cucumber.junit.FeatureRunner.runChild(FeatureRunner.java:23)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at io.cucumber.junit.Cucumber.runChild(Cucumber.java:142)
    at io.cucumber.junit.Cucumber.runChild(Cucumber.java:65)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at io.cucumber.junit.Cucumber$RunCucumber.evaluate(Cucumber.java:172)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)
    at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:102)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:82)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:78)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy2.stop(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.base/java.lang.Thread.run(Thread.java:834)


...
  

Код компилируется и запускается. Но все наши тесты просто терпят неудачу, и все по причине, подобной этой:

 The step "er is een lijst van bestellingen" is undefined
  

Похоже, что, возможно, Cucumber действительно не распознает наш feature -file?

Полный код на Git: https: //gitlab.com/RobinSel/delidish-cucumber

Комментарии:

1. Подумайте о том, чтобы прочитать инструкции, прилагаемые к вашему домашнему заданию. Смотрите RunCucumberTest .

2. @M.P.Korstanje Спасибо! Однако после изменения атрибута клея на правильный пакет код выполняется без каких-либо ошибок, но выдает сообщение Test events were not received в IntelliJ.