问题描述
我在 class1 中有 @test 方法,在超类中有 @before 方法。我想在 @before 方法中访问 class1 中声明的类变量。
解决方法
没有。这违反了继承规则。超类是父类,你问题中提到的class1是子类。
子类可以访问父类的属性,但反之亦然。 Here 是一个类似的问题,但有更多解释。
,术语“类变量”用于表示静态变量。我假设您打算讨论“实例变量”的使用。如果要在父类中使用实例变量,那么理想情况下它应该是父类的实例变量。
如果您确实想在父类中使用子类的“类变量”(或静态变量),则可以(如果它具有相关的访问修饰符)
,可以使用反射访问实例变量和类变量。虽然这不是推荐的方式(如共享评论所述)。
您可以使用谷歌的 guice
库为 @Before
和 @After
钩子在 testng 中使用已经实现的依赖注入。分享一个相同的例子:
public class Test extends BaseTest {
String stringOne = "INTER";
static final String stringTwo = "MISSION";
@Test(testName = "Sample Test")
private void reflection_test() {
System.out.println("-----INSIDE THE SUB CLASS-----");
System.out.println(stringOne + stringTwo);
}
}
现在在基类中存在的 @Before
中,我们将 ITestResult
作为参数添加到方法中(您可以阅读 testng 的依赖注入 here)。
现在使用 ITestResult
参数,我们可以获取测试类,然后可以使用该类使用 Java 反射获取实例化的类对象、字段、方法等。检查以下示例:
public class BaseTest {
@BeforeMethod(alwaysRun = true)
public void init(ITestResult result) throws IllegalAccessException {
Class clazz = result.getTestClass().getRealClass();
System.out.println("-----THIS IS FROM THE PARENT CLASS-----");
for (Field f : clazz.getDeclaredFields()) {
System.out.println("Variable Value : " + f.get(this));
}
System.out.println();
}
}
在执行测试时,我们将收到此输出:
-----THIS IS FROM THE PARENT CLASS-----
Variable Value : INTER
Variable Value : MISSION
-----INSIDE THE SUB CLASS-----
INTERMISSION