如果不是直接父级,TestNG @BeforeClass不会从超类运行

时间:2015-11-13 09:20:50

标签: java unit-testing testng

说类继承就像C - > B - > A是最顶级的超类。

  class A {
     @BeforeClass
     void setUp() {
       //some stuff
      }
    }

    class B extends A {

    }

    @Test
    class C extends B {
      //running this class DOES NOT invoke setUp() from A.
    }

我在A类中有@BeforeClass testng注释。我只用@Test注释C类。现在,我希望在运行C类时,它应该在超类A中执行@BeforeClass注释方法。但事实并非如此。

但是当我将@BeforeClass注释移动到B类时它会运行。

有什么想法吗?

现在,解决方法是在B级重新注释。

  class A {
     @BeforeClass
     void setUp() {
       //some stuff
      }
    }

    class B extends A {
      @BeforeClass
      void setUp() {
        super.setUp();
        //some stuff
      }
    }

    @Test
    class C extends B {
      //running this class invokes setUp() from only B.
    }

注意:如果只有两个级别的继承,那么问题就不存在了。

3 个答案:

答案 0 :(得分:3)

问题是A和B之间的方法名称相同。

当TestNG正在寻找配置方法时,它无法在setUp() B方法上找到注释。 在每种情况下,您都必须在B中注释您的方法,因为TestNG无法在没有注释的情况下找到配置方法。

您可以保持使用的工作,也可以重命名一种配置方法。 setUp不再是强制性的。

但我们可以认为这是一个可以通过TestNG解决的问题。因此,您应该在项目上打开一张票:latest Windows SDK

答案 1 :(得分:0)

在使用组进行测试时,有时也会出现这种情况。 在这种情况下,您可以确保使用父级设置的方法是使用alswaysRun = true,就像这样:

  @BeforeClass(alwaysRun = true)
  public void parentSetupClass() {

  }

来源https://testng.org/doc/documentation-main.html

对于before方法(beforeSuite,beforeTest,beforeTestClass和 beforeTestMethod,而不是beforeGroups):如果设置为true,则此 无论配置属于哪个组,都将运行配置方法 至。对于after方法(afterSuite,afterClass,...):如果设置为true, 即使一个或多个方法也将运行此配置方法 先前调用失败或被跳过。

答案 2 :(得分:-2)

@BeforeClass and @AfterClass是隐式静态方法,不支持继承。

如果要引用A类@BeforeClass and @AfterClass方法,则需要调用B类@BeforeClass and @AfterClass中的方法,如下所示。它是隐藏在Java中的方法的概念。

public class A {
     @BeforeClass
     public static void setUp() {
       System.out.println("A");
      }
}
public class B extends A {
      @BeforeClass
      public static void setUp() {
        A.setUp();
        System.out.println("B");
      }
}
public class C extends B {
      //running this class invokes setUp() from B.
        @Test
        public void test() {
            System.out.println("test in C");
        }
}

输出如下。

A
B
test in C