【问题标题】:Cucumber ignoring @BeforeEach annotation and giving NullPointerExceptions黄瓜忽略 @BeforeEach 注释并给出 NullPointerExceptions
【发布时间】:2020-11-12 19:37:56
【问题描述】:

我们正在使用 Cucumber 库来自动化我们的用户故事测试。测试确实运行了,但所有测试都失败了,因为我们得到了很多 NullPointer-exceptions。

这些NullPointer-exceptions 的原因是 Cucumber 忽略了我们放置在一个名为 setUp() 的函数上方的 @BeforeEach-annotation,我们在其中定义了所有变量。

以第 56 行的 @Given("er is een lijst van bestellingen") 为例。assertEqual 函数失败,因为我们的列表 bestellingen 有零项。但是我们已经在 setUp() 函数中添加了这些项目...

我们真的不知道如何正确使用这个库,文档也没有进一步帮助我们。

这是我们相关的测试代码:

package be.kdg.cucumber;

import io.cucumber.java.Before;
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 = new 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
    @Before
    void setUp() {
        //System.out.println("lol");
        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);

        System.out.println("xxxx " + bestellingen.getSize());

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

    @Given("er is een lijst van bestellingen")
    public void er_is_een_lijst_van_bestellingen() {
        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 de_koerier_met_id_kiest_een_bestelling_met_id(Integer int1, Integer int2) {

        if (c1.getId() == int1) {

            if (b1.getId() == int2) {

                c1.setActieveBestelling(b1);
            }
        }
    }

    @Then("De koerier met id {int} heeft een actieve bestelling met id {int}")
    public void de_koerier_met_id_heeft_een_actieve_bestelling_met_id(Integer int1, Integer int2) {
        assertEquals(int1, c1.getId(), "De id van de koerier moet " + int1 + " zijn");
        assertEquals(int2, b1.getId(), "De id van de bestelling moet " + int2 + " 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 er_is_een_actieve_bestelling_met_id_bij_de_koerier_met_id(Integer int1, Integer int2) {
        assertEquals(int1, c1.getId(), "De id van de koerier moet " + int1 + " zijn");
        assertEquals(int2, c1.getActieveBestelling().getId(), "De actieve bestelling van de koerier" + int2 + " moet als id " + int1 + " 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 bestelling_met_id_is_afgehaald_door_de_koerier_met_id(Integer int1, Integer int2) {
        if (c1.getId() == int1) {
            if (b1.getId() == int2) {
                c1.getActieveBestelling().setStatus(BestellingStatus.AFGEHAALD);
            }
        }
    }

    @Then("Bestelling met id {int} heeft status afgehaald")
    public void bestelling_met_id_heeft_status_afgehaald(Integer int1) {
        assertEquals(int1, b1.getId(), "De id van de bestelling moet " + int1 + " 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 er_is_een_actieve_bestelling_met_id_bij_de_koerier_met_id_met_status_afgehaald(Integer int1, Integer int2) {
        assertEquals(int2, c1.getId(), "De id van de koerier moet " + int2 + " zijn");
        assertEquals(int1, c1.getActieveBestelling().getId(), "De actieve bestelling van de koerier" + int2 + " moet als id " + int1 + " 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 bestelling_met_id_wordt_geleverd_door_koerier_met_id(Integer int1, Integer int2) {
        if (c1.getId() == int2) {
            if (b1.getId() == int1) {
                c1.getActieveBestelling().setStatus(BestellingStatus.GELEVERD);
            }
        }
    }

    @Then("Bestelling met id {int} heeft status geleverd")
    public void bestelling_met_id_heeft_status_geleverd(Integer int1) {
        assertEquals(int1, b1.getId(), "De id van de bestelling moet " + int1 + " 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  de_koerier_met_id_krijgt_punten(Integer int1, Integer int2) {
        if (c1. getId() == int1) {
            c1.addPunten(int2);
            c1.voltooiBestelling();
        }
    }

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

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

    @Given("De koerier met id {int} heeft een account")
    public void de_koerier_met_id_heeft_een_account(Integer int1) {
        assertEquals(int1, c1.getId(), "De koerier met deze id bestaat niet");
        throw new cucumber.api.PendingException();
    }

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


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

Git 上的完整项目:https://gitlab.com/NielD/cucumber

【问题讨论】:

  • Cucumber 有自己的钩子。它们与 JUnit 中的不同。

标签: java junit cucumber


【解决方案1】:

org.junit.jupiter.api.BeforeEach 不受 Cucumber 支持。 Cucumber 知道它是自己的 @Before 钩子。 欲了解更多信息,请查看Cucumber documentation on Hooks

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多