在 JUnit 或 TestNG 中的两个测试 类 之间共享一个对象
Sharing an Object between two Test classes in either JUnit or TestNG
请原谅这个初级问题,我正在学习 Java 仍然需要一些关于最佳实践的建议。我有一个有效的场景,我希望使用 JUnit 或 TestNG 在两个不同的测试 class 之间共享同一个对象。我知道 tests/test classes 通常不应该共享状态,但这是一个漫长的 运行 旅程。
我了解 JVM 按以下顺序为两个框架执行:
- @之前Class
- 构造函数调用
- @之前
- @测试
假设我有一个 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);
请原谅这个初级问题,我正在学习 Java 仍然需要一些关于最佳实践的建议。我有一个有效的场景,我希望使用 JUnit 或 TestNG 在两个不同的测试 class 之间共享同一个对象。我知道 tests/test classes 通常不应该共享状态,但这是一个漫长的 运行 旅程。
我了解 JVM 按以下顺序为两个框架执行:
- @之前Class
- 构造函数调用
- @之前
- @测试
假设我有一个 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);