@BeforeClass и наследование - порядок выполнения

У меня есть абстрактный базовый класс, который я использую в качестве основы для своих модульных тестов (TestNG 5.10). В этом классе я инициализирую целую среду для своих тестов, настраивая отображения базы данных, и т.д. Этот абстрактный класс имеет метод с a @BeforeClass аннотация, которая делает инициализацию.

Затем, я расширяю тот класс с помощью определенных классов, в которых я имею @Test методы и также @BeforeClass методы. Эти методы делают определенную для класса инициализацию среды (например, поместите некоторые записи в базу данных).

Как я могу осуществить определенный порядок @BeforeClass аннотируемые методы? Мне нужны те от абстрактного базового класса, который будет выполняться перед теми расширяющегося класса.

Пример:

abstract class A {
    @BeforeClass
    doInitialization() {...}
}

class B extends A {
    @BeforeClass
    doSpecificInitialization() {...}

    @Test
    doTests() {...}
}

Ожидаемый порядок:

A.doInitialization
B.doSpecificInitialization
B.doTests

Фактический порядок:

B.doSpecificInitialization // <- crashes, as the base init is missing
(A.doInitialization        // <---not executed
 B.doTests)                // <-/
88
задан Nathan 28 October 2016 в 16:49
поделиться

4 ответа

Не помещайте @beforeClass на Class . Позвоните в каждый подкласс.

abstract class A {
    void doInitialization() {}
}

class B extends A {
    @BeforeClass
    void doSpecificInitialization() {
        super.doInitialization();
    }

    @Test
    void doTests() {}
}

Похоже, что Testng имеет @beforeClass (dependesonmethods = {"doinitiatization"}) - придайте ему попробовать.

45
ответ дан 24 November 2019 в 07:32
поделиться

Я только что попробовал свой пример с 5.11, и я получаю @beforeass базового класса, привязанных первым.

Можете ли вы опубликовать файл testng.xml? Может быть, вы указываете как A, так и B там, хотя нужно только B.

Не стесняйтесь следить за списком рассылки Testng-пользователей, и мы можем приблизить свою проблему.

- Cedric

6
ответ дан 24 November 2019 в 07:32
поделиться

Редактировать: Ответ ниже предназначен для junit , но я все равно оставлю это здесь, потому что это может быть полезно.

Согласно Junit API : «Методы суперклассов @beforeClass будут выполняться до тех текущих класс».

Я проверил это, и, кажется, работает для меня.

Однако, поскольку @odys упоминается ниже, для Junit вы должны иметь два метода, названные по-разному , хотя, поскольку в противном случае приведет к выполнению только метода подкласса, потому что родитель будет затенено.

99
ответ дан 24 November 2019 в 07:32
поделиться

Как насчет того, чтобы ваш метод @BeforeClass вызывал пустой метод specificBeforeClass (), который может или не может быть перезаписан подклассами, например:

public class AbstractTestClass {
  @BeforeClass
  public void generalBeforeClass() {
    // do stuff
    specificBeforeClass();
  }

  protected void specificBeforeClass() {}
}

public class SpecificTest {
  @Override
  protected void specificBeforeClass() {
    // Do specific stuff
  }

  // Tests
}
1
ответ дан 24 November 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: