首页 > 解决方案 > 在 JUnit 或 TestNG 中的两个测试类之间共享一个对象

问题描述

原谅这个基本问题,我还在学习 Java,所以在这里需要一些关于最佳实践的建议。我有一个有效的场景,我希望使用 JUnit 或 TestNG 在两个不同的测试类之间共享同一个对象。我知道测试/测试类通常不应该共享状态,但这是一个漫长的旅程。

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

  1. @课前
  2. 构造调用
  3. @前
  4. @测试

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

public class FirstPersonTest {

    private Person firstPerson;

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

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

第二个测试类:

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);
    }
}

firstPerson在第二类中访问对象的最佳方式是什么?我不想再次实例化它,因为我希望共享状态以进行旅程测试。

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

标签: javajunittestng

解决方案


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

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 对象的 name 字段。

储藏:

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

要取回它:

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

推荐阅读