@BeforeClass和继承 - 执行顺序

Dom*_*aja 88 java testng unit-testing

我有一个抽象基类,我用它作为单元测试的基础(TestNG 5.10).在这个类中,我初始化我的测试的整个环境,设置数据库映射等.这个抽象类有一个带有@BeforeClass注释的方法来进行初始化.

接下来,我使用特定的类扩展该类,其中我有@Test方法和@BeforeClass方法.这些方法对类环境进行特定于类的初始化(例如,将一些记录放入数据库中).

我如何强制执行@BeforeClass注释方法的特定顺序?我需要抽象基类中的那些在扩展类之前执行.

例:

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

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

    @Test
    doTests() {...}
}
Run Code Online (Sandbox Code Playgroud)

预期订单:

A.doInitialization
B.doSpecificInitialization
B.doTests
Run Code Online (Sandbox Code Playgroud)

实际订单:

B.doSpecificInitialization // <- crashes, as the base init is missing
(A.doInitialization        // <---not executed
 B.doTests)                // <-/
Run Code Online (Sandbox Code Playgroud)

For*_*ega 99

编辑:下面的答案适用于JUnit,但无论如何我都会留在这里,因为它可能会有所帮助.

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

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

但是,正如@Odys在下面提到的那样,对于JUnit,您需要以不同的方式命名两个方法,否则将导致仅运行子类方法,因为父级将被遮蔽.

  • 即使最初的问题是针对TestNG,我在谷歌搜索JUnit之后来到这里,你的答案也有所帮助 - 谢谢! (53认同)
  • 对于JUnit,你需要**让两个方法命名不同,但是否则会导致只运行子类方法,因为父类将被遮蔽. (9认同)
  • @Odys,非常感谢您提到这一点。我正在努力弄清为什么子类中的“ setup”方法正在运行,而其父类中的“ setup”方法却没有运行。您刚刚救了我一大堆麻烦! (2认同)

Boz*_*zho 46

不要把它@BeforeClass放在abstract课堂上.从每个子类中调用它.

abstract class A {
    void doInitialization() {}
}

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

    @Test
    void doTests() {}
}
Run Code Online (Sandbox Code Playgroud)

看起来像TestNG @BeforeClass(dependsOnMethods={"doInitialization"})- 尝试一下.

  • 这基本上是我想要避免的:不需要显式调用super(抽象)类的方法.特别是因为我也有类,它继承自A但没有自己的@BeforeClass方法.我必须为此目的插入一个. (8认同)
  • `dependsOnMethods`解决方法可以解决问题.虽然我更喜欢"超级优先"的方法...... (5认同)

小智 7

我添加public到抽象类和TestNG(6.0.1)之前执行了doInitialization()doTests.doInitialization()如果public从A类中删除,TestNG不会执行.

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

class B extends A {    
 @Test
 doTests() {...}
}
Run Code Online (Sandbox Code Playgroud)


Ced*_*ust 6

我刚用5.11尝试了你的例子,我首先调用了基类的@BeforeClass.

你可以发布你的testng.xml文件吗?也许你在那里同时指定A和B,而只需要B.

随意关注testng-users邮件列表,我们可以仔细查看您的问题.

- 塞德里克

  • 没有.xml for testng定义(显式),它是从Eclipse和Maven运行的. (2认同)