java - 在 JUnit 或 TestNG 中的两个测试类之间共享一个对象
问题描述
原谅这个基本问题,我还在学习 Java,所以在这里需要一些关于最佳实践的建议。我有一个有效的场景,我希望使用 JUnit 或 TestNG 在两个不同的测试类之间共享同一个对象。我知道测试/测试类通常不应该共享状态,但这是一个漫长的旅程。
我了解 JVM 按以下顺序为这两个框架执行:
- @课前
- 构造调用
- @前
- @测试
假设我有一个 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
在构造函数或带注释的设置方法中传递实例,但不希望SecondPersonTest
在FirstPersonTest
解决方案
您可以为此目的使用单例类。
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);
推荐阅读
- java - 如何在 android 的 ViewModel 中从一个 LiveData 对象获取数据到另一个对象?
- xamarin - VS 没有使用 System + Unhandled 异常
- node.js - 使用 node 和 pg-promise 加入 postgres 中的值列表
- swift - 具有自我类型要求的协议上的类型擦除
- python - 修改数据库的方法正在使从数据库中删除行的方法不起作用
- javascript - 单击按钮后等待ajax请求解决
- sql - 带有 LIKE 子句的 SQL LEFT JOIN 仅给出一行
- mysql - #1136 - 列计数与第 1 行的值计数不匹配,不缺少逗号。值中没有额外的逗号
- node.js - LoopBack 4 - 在 API 资源管理器中添加“授权”按钮
- rest - 在 Bot Framework 中外部 API 调用成功时发送消息