@Test 在 TestNG Selenium 中调用 Parent class 构造函数

@Test is calling Parent class constructor in TestNG Selenium

我是Java的新手,请看下面的代码

//Parent Class 
public class Abc {
    Abc(){System.out.println("hiii");
    }
}

//Child Class

public class CDE extends Abc{
    @Test
    public void Xyz(){
        System.out.println("hi");
    }
    }   

Output is coming as 
hiii
hi
PASSED: Xyz

请帮忙,我不确定为什么在我什至没有使用新关键字创建时调用父 class 的构造函数 object.I 已经创建了两个不同的 class如果我在子 class 中创建主要方法,即不使用 TestNG @Test 注释,Eclipse.Same 中的 es 不会发生。

这叫做构造函数链接。它通过使用继承发生。 subclass 构造方法总是调用它的 superclass 构造方法。这确保了 subclass 对象的创建从继承链中它上面的 classes 的初始化开始。

继承链中可以有任意数量的 classes。每个构造函数方法都将调用链,直到到达并初始化顶部的 class。然后下面的每个后续 class 都会随着链回落到原始子 class 进行初始化。这个过程称为构造函数链接。

您可以参考https://www.thoughtco.com/constructor-chaining-2034057

当您使用来自 TestNG 的 @Test 注释时,以下是 TestNG 在幕后所做的事情。

  • 它首先加载您的 class。
  • 它列出了所有要 运行 的 TestNG 注释方法(例如,@Test@BeforeClass 等),并以 TestNG 方式对它们进行排序(即 @BeforeSuite@BeforeTest@BeforeClass@Test 等等)
  • 它会在您的 class 中找到一个默认构造函数。如果未找到默认构造函数,它会尝试查找采用字符串的 1 参数构造函数。
  • 现在使用反射 class 实例化。
  • 现在使用通过反射获得的测试实例 class,TestNG 开始按 pre-defined 顺序调用各种带注释的方法。

你的基础 class 构造函数被调用的原因是因为 TestNG 通过反射实例化你的 child class,这会触发构造函数链向上继承阶梯(哪个就是所谓的Constructor Chaining)

您可以通过向 child class CDE 添加构造函数并添加 System.out.println 来测试该理论。您将看到正在执行的打印语句。

当您通过 main() 方法执行此操作时,不涉及反射,因为不涉及 TestNG。