@BeforeClass和继承 - 执行顺序

2022-08-31 10:33:04

我有一个抽象基类,我用它作为单元测试的基础(TestNG 5.10)。在此类中,我初始化整个环境以进行测试,设置数据库映射等。这个抽象类有一个带有注释的方法,该方法执行初始化。@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)                // <-/

答案 1

编辑:下面的答案是针对JUnit的,但我还是会把它留在这里,因为它可能会有所帮助。

根据JUnit api:“超类的@BeforeClass方法将在当前类之前运行。

我测试了这个,它似乎对我有用。

但是,正如下面@Odys提到的,对于 JUnit,您需要以不同的方式命名这两个方法,否则将导致仅运行子类方法,因为父级将被阴影化。


答案 2

不要把 放在课堂上。从每个子类调用它。@BeforeClassabstract

abstract class A {
    void doInitialization() {}
}

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

    @Test
    void doTests() {}
}

似乎TestNG有@BeforeClass(dependsOnMethods={“doInitialization”}) - 试一试。


推荐