说类继承就像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.
}
注意:如果只有两个级别的继承,那么问题就不存在了。
答案 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