为什么 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 注释方法。