为什么 TestNG 的 beforeSuite 只为一个 class 提供值而另一个 class 为空?
Why TestNG's beforeSuite only provides a value for one class while the other class gets null?
我对 TestNG 中的 BeforeSuite
注释有疑问。
我想在 beforeSuite()
中初始化一些变量,以便所有 classes 都可以直接使用它们。只有 class A 可以获取该值。 Class B不能;它变为空。
Base.java:
public class Base {
public String name;
@BeforeSuite
public void beforeSuite(){
name = "Whosebug";
}
}
A.java:
public class A extends Base{
@Test
public void test(){
System.out.println("A name:" + name);
}
}
B.java
public class B extends Base{
@Test
public void test(){
System.out.println("B name:" + name);
}
}
textng.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="suite1" parallel="classes" thread-count="1" preserve-order="true">
<test name="testValue">
<classes>
<class name="A"/>
<class name="B"/>
</classes>
</test>
</suite>
测试结果:
mvn clean test
.
.
.
[INFO] Running TestSuite
B name:null
A name:Whosebug
我的TestNG版本是6.8.8。
问题出在测试代码上。您有一个公共基础 class,它正在被多个子 classes 扩展,并且在基础 class 中您有一个 @BeforeSuite
方法。
TestNG 通过行为保证 @BeforeSuite
方法每个 <suite>
标签只执行一次。
在您的情况下,它已经为 class A
调用,因此将跳过 class B
,这解释了 NullPointerException
。
要解决此问题,您需要将初始化移动到 @BeforeMethod
或 @BeforeClass
注释方法。
我对 TestNG 中的 BeforeSuite
注释有疑问。
我想在 beforeSuite()
中初始化一些变量,以便所有 classes 都可以直接使用它们。只有 class A 可以获取该值。 Class B不能;它变为空。
Base.java:
public class Base {
public String name;
@BeforeSuite
public void beforeSuite(){
name = "Whosebug";
}
}
A.java:
public class A extends Base{
@Test
public void test(){
System.out.println("A name:" + name);
}
}
B.java
public class B extends Base{
@Test
public void test(){
System.out.println("B name:" + name);
}
}
textng.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="suite1" parallel="classes" thread-count="1" preserve-order="true">
<test name="testValue">
<classes>
<class name="A"/>
<class name="B"/>
</classes>
</test>
</suite>
测试结果:
mvn clean test
.
.
.
[INFO] Running TestSuite
B name:null
A name:Whosebug
我的TestNG版本是6.8.8。
问题出在测试代码上。您有一个公共基础 class,它正在被多个子 classes 扩展,并且在基础 class 中您有一个 @BeforeSuite
方法。
TestNG 通过行为保证 @BeforeSuite
方法每个 <suite>
标签只执行一次。
在您的情况下,它已经为 class A
调用,因此将跳过 class B
,这解释了 NullPointerException
。
要解决此问题,您需要将初始化移动到 @BeforeMethod
或 @BeforeClass
注释方法。