有没有一种方法可以让类变量进入超类的testNG-before方法

有没有一种方法可以让类变量进入超类的testNG-before方法,testng,testng-annotation-test,Testng,Testng Annotation Test,我在类1中有@test方法,在超类中有@before方法。我想让class1中声明的类变量在@before方法中访问。否。这违反了继承规则。超级类是父类,您的问题中提到的类1是子类 子类可以访问父类的属性,但是vica-versa不是真的。是一个有更多解释的类似问题。术语“类变量”用于表示静态变量。我假设您打算讨论“实例变量”的使用。如果要在父类中使用实例变量,则理想情况下它应该是父类的实例变量 如果您确实希望在父类中使用子类的“类变量”(或静态变量),则可以(如果它具有相关的访问修饰符)使用反

我在类1中有@test方法,在超类中有@before方法。我想让class1中声明的类变量在@before方法中访问。

否。这违反了继承规则。超级类是父类,您的问题中提到的类1是子类

子类可以访问父类的属性,但是vica-versa不是真的。是一个有更多解释的类似问题。

术语“类变量”用于表示静态变量。我假设您打算讨论“实例变量”的使用。如果要在父类中使用实例变量,则理想情况下它应该是父类的实例变量


如果您确实希望在父类中使用子类的“类变量”(或静态变量),则可以(如果它具有相关的访问修饰符)

使用反射访问实例变量和类变量。尽管这不是推荐的方式(如共享评论所述)

您可以使用google的
guice
库在testng中为
钩子使用已经实现的依赖项注入。分享一个相同的例子:


公共类测试扩展了BaseTest{
字符串stringOne=“INTER”;
静态最终字符串stringTwo=“任务”;
@测试(testName=“样本测试”)
私有虚反射_测试(){
System.out.println(“----子类内------”);
System.out.println(stringOne+stringTwo);
}
}
现在,在基类中存在的
@Before
中,我们将
ITestResult
作为参数添加到方法中(您可以阅读testng的依赖项注入)

现在使用
ITestResult
参数,我们可以获得测试类,然后可以使用Java反射获得实例化的类对象、字段、方法等。检查以下示例:

公共类基类测试{
@BeforeMethod(alwaysRun=true)
public void init(ITestResult result)抛出IllegalAccessException{
Class clazz=result.getTestClass().getRealClass();
System.out.println(“----这来自父类------”);
for(字段f:clazz.getDeclaredFields()){
System.out.println(“变量值:”+f.get(this));
}
System.out.println();
}
}
在执行测试时,我们将收到以下输出:

-----THIS IS FROM THE PARENT CLASS-----
Variable Value : INTER
Variable Value : MISSION

-----INSIDE THE SUB CLASS-----
INTERMISSION

这真的是运行此代码后的输出吗?这里使用作为运行测试的一部分创建的子对象检索子类的字段。违反继承规则的情况不会发生。此外,实现这一点不需要反射。只是一个简单的
if(ChildTest的这个实例)System.out.println(((ChildTest)this.stringOne)。只有当所有字段都是必需的,以便可以在循环中执行时,反射才有帮助。从问题来看,似乎只需要几个字段。嘿@GauthamM,是的,上面的输出来自执行代码。这将取决于OP需要多少字段来配合他的事业(使用反射或基于实例类型的简单类型转换)。根据您的评论,我在回答中删除了继承的用法。请注意,使用
ITestResult
的此解决方案不适用于较旧版本的testNG,如
6.8
。因为在这样的版本中,
ITestResult
中的属性在到达BeforeMethod时将为null,这将导致BeforeMethod失败。这已在较新版本中修复。因此,我建议将
Method
作为参数接收,然后使用
clazz=Method.getDeclaringClass()
。或者您可以删除所有参数,只需使用
clazz=this.getClass()