У меня есть абстрактный базовый класс, который я использую в качестве основы для своих модульных тестов (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) // <-/
Не помещайте @beforeClass
на Class
. Позвоните в каждый подкласс.
abstract class A {
void doInitialization() {}
}
class B extends A {
@BeforeClass
void doSpecificInitialization() {
super.doInitialization();
}
@Test
void doTests() {}
}
Похоже, что Testng имеет @beforeClass (dependesonmethods = {"doinitiatization"})
- придайте ему попробовать.
Я только что попробовал свой пример с 5.11, и я получаю @beforeass базового класса, привязанных первым.
Можете ли вы опубликовать файл testng.xml? Может быть, вы указываете как A, так и B там, хотя нужно только B.
Не стесняйтесь следить за списком рассылки Testng-пользователей, и мы можем приблизить свою проблему.
- Cedric
Редактировать: Ответ ниже предназначен для junit , но я все равно оставлю это здесь, потому что это может быть полезно.
Согласно Junit API : «Методы суперклассов @beforeClass будут выполняться до тех текущих класс».
Я проверил это, и, кажется, работает для меня.
Однако, поскольку @odys упоминается ниже, для Junit вы должны иметь два метода, названные по-разному , хотя, поскольку в противном случае приведет к выполнению только метода подкласса, потому что родитель будет затенено.
Как насчет того, чтобы ваш метод @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
}