【问题标题】:TestNG @BeforeClass doesn't run from super class if it not an immediate parent如果不是直接父级,则 TestNG @BeforeClass 不会从超类运行
【发布时间】:2015-11-13 09:20:50
【问题描述】:

说类继承就像 C -> B -> A 其中 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.
    }

注意:如果开始时只有两个继承级别,则问题不存在。

【问题讨论】:

    标签: java unit-testing testng


    【解决方案1】:

    在您的测试中使用组时,您有时也会遇到这种情况。 在这种情况下,您可以做一件事来确保父设置方法被注释为使用alswaysRun = true,如下所示:

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

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

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

    【讨论】:

      【解决方案2】:

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

      TestNG在寻找配置方法时,找不到BsetUp()方法上的注解。 在任何情况下,您都必须在 B 中注释您的方法,因为 TestNG 无法找到没有注释的配置方法。

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

      但是我们可以假设这是一个TestNG也可以解决的问题。所以,你应该在这个项目上开一张票:http://github.com/cbeust/testng

      【讨论】:

      • 我最初的描述并不清楚。现在进行编辑以解释问题。
      • 你使用哪个版本的testng?可以试试最新的(6.9.9)吗?
      • 适用于 6.9.9。我之前使用的是 6.9.6。谢谢juherr!
      【解决方案3】:

      @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
      

      【讨论】:

      • 完全错了,你把JUnit和TestNG搞混了。
      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 2015-06-27
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      相关资源
      最近更新 更多