在 JUnit 或 TestNG 中的两个测试 类 之间共享一个对象

Sharing an Object between two Test classes in either JUnit or TestNG

请原谅这个初级问题,我正在学习 Java 仍然需要一些关于最佳实践的建议。我有一个有效的场景,我希望使用 JUnit 或 TestNG 在两个不同的测试 class 之间共享同一个对象。我知道 tests/test classes 通常不应该共享状态,但这是一个漫长的 运行 旅程。

我了解 JVM 按以下顺序为两个框架执行:

  1. @之前Class
  2. 构造函数调用
  3. @之前
  4. @测试

假设我有一个 Person class 有一个字段 name 和一个 getter & setter 相同,我在一个测试中实例化它的一个实例 Class:

public class FirstPersonTest {

    private Person firstPerson;

    @BeforeClass
    private void setup() {
        firstPerson = new Person("Dave");
    }

    @Test
    public void testName() {
        assertEquals("Dave", firstPerson.getName());
    }
}

第二个测试class:

public class SecondPersonTest {

    private Person firstPerson;
    private static String name;

    @BeforeClass
    private void setup(){
        name = firstPerson.getName(); //null pointer, firstPerson reference no longer exists from FirstPersonTest
    }

    @Test
    public void testName(){
        assertEquals("Dave", name);
    }
}

访问第二个 class 中的 firstPerson 对象的最佳方式是什么?我不想第二次实例化它,因为我想为旅程测试共享状态。

我希望能够在构造函数或带注释的设置方法中传递 firstPerson 实例,但不希望在 FirstPersonTest 的主体中实例化 SecondPersonTest

您可以为此目的使用单例 class。

public class LocalStorage {
    private static volatile LocalStorage instance;
    private Map<String, Object> data = new HashMap<>();

    private LocalStorage() {
    }

    public static LocalStorage getInstance() {
        if (instance == null) {

            synchronized (LocalStorage.class) {
                if (instance == null) {
                    instance = new LocalStorage();
                }
            }
        }

        return instance;
    }

    public static void addData(String key, Object value) {
        getInstance().data.put(key, value);
    }

    public static Object getData(String key) {
        return getInstance().data.get(key);
    }

    public static <T> T getData(String key, Class<T> clazz) {
        return clazz.cast(getInstance().data.get(key));
    }
}

您可以存储整个 Person 对象或仅存储 Person 对象的名称字段。

要存储:

Person firstPerson = new Person("Dave");
LocalStorage.addData("Dave", firstPerson);

取回:

Person firstPerson = LocalStorage.getData("Dave", Person.class);