Почему @BeforeClass не срабатывает?

Это одна схема сценария Cucumber, взятая из существующей кодовой базы, но меня попросили попробовать ее с TestNG. Некоторые вещи (сценарий(), сценарии(), TestNGCucumberRunner, DataProvider) были взяты из другого сообщения на stackoverflow, так как я не мог понять, как заставить схему сценария хорошо работать с TestNG.

public class StepsSettings {
    private WebDriver driver;
    private SettingsPage settingsPage;
    private SearchBlock searchBlock;
    private TestNGCucumberRunner testNGCucumberRunner;

    @Test
    @Given("maximum results per page is set to {int}")
    public void maximumResultsPerPageIsSetTo(int results) {
        settingsPage = new SettingsPage(driver);
        searchBlock = new SearchBlock(driver);
        settingsPage.navigateTo();
        settingsPage.setNumberOfResults(results);
    }

    @Test
    @When("the user searches for {string} in collection {string}")
    public void theUserSearchesForInCollection(String key, String collection) {
        searchBlock.performSearch(key, collection);
    }

    @Test
    @Then("the number of publications displayed is no more than {int}")
    public theNumberOfPublicationsDisplayedIsNoMoreThan(int count) {
        By articlesBy = By.cssSelector("article");

        Assert.assertTrue(settingsPage.getObjects(articlesBy).size() <= count);
    }

    @Test(groups = "cucumber scenarios", description = "Runs Cucumber Scenarios", dataProvider = "scenarios")
    public void scenario(PickleWrapper pickleEvent, FeatureWrapper cucumberFeature) throws Throwable {
        testNGCucumberRunner.runScenario(pickleEvent.getPickle());
    }

    @DataProvider
    public Object[][] scenarios() {
        testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
        return testNGCucumberRunner.provideScenarios();
    }

    @BeforeClass(alwaysRun = true)
    public void setup() {
        System.setProperty(
            "webdriver.chrome.driver",
            System.getProperty("user.dir") + "\\webdriver\\chromedriver.exe"
        );
        driver = new ChromeDriver();
    }

    @AfterClass(alwaysRun = true)
    public void teardown() {
        driver.quit();
        testNGCucumberRunner.finish();
    }
}

При выполнении единственной ошибкой является исключение NullPointerException из-за того, что @BeforeClass не срабатывает, когда драйвер WebDriver получает свое значение.

Часть, касающуюся Scenario Outlines, я не совсем понимаю, но, по крайней мере, я больше не получаю ошибку cannot inject @test с аннотированным методом.


person Brazen    schedule 24.03.2021    source источник
comment
похоже, нужно использовать до/после класса в тестовом классе вместо класса шагов. stackoverflow .com/questions/51325450/   -  person murali selenium    schedule 25.03.2021


Ответы (2)


Методы, аннотированные с помощью Before/AfterClass, ДОЛЖНЫ быть статическими.

person Anatoly    schedule 24.03.2021
comment
Вы очень уверены в этом? Я видел несколько примеров в Интернете и тестировал их в простейшей форме, и методы не обязательно должны быть статичными. Я знаю, что с Junit они должны быть, но мой вопрос конкретно о TestNG. - person Brazen; 25.03.2021

Пожалуйста, используйте @BeforeTest вместо @BeforeClass. Если проблема решена, попробуйте здесь понять поток тестовых аннотаций. Или прокомментируйте здесь для получения дополнительной помощи.

person Istiaque Ahmed    schedule 25.03.2021
comment
\@BeforeTest дает тот же результат. Кроме того, я хотел бы использовать \@BeforeClass, так как я хочу, чтобы он срабатывал только один раз, перед первым методом класса, а не перед каждым методом. - person Brazen; 25.03.2021