java - 使用 JUnit 测试构造函数(或设置器)的最佳方法是什么?
问题描述
我有两种解决方案来测试我的构造函数(或设置器)。
首先是使用getters
.
public void Test() {
Person p = new Person("toto"); // name
assertEquals("toto", p.getName());
}
二是使用Field
类
public void Test() {
Person p = new Person("toto"); // name
final Field fieldName = p.getClass().getDeclaredField("name");
fieldName.setAccessible(true);
assertEquals("toto", fieldName.get(p));
}
你的建议是什么,为什么?谢谢你。
解决方案
IMO,应尽可能避免反射。当然,在某些情况下需要它,但在大多数情况下,不值得在性能和安全性上进行大量权衡。
其次,可以说更重要的是,如果测试一段代码的唯一方法是使用反射,那么您可能不需要测试它。
考虑以下示例:
public class Message {
private String message;
public Message(Message message) {
this.message = message;
}
// NO GETTERS/SETTERS
}
如果我想测试这个构造函数是否“有效”,我可以编写一个测试,使用反射来查看我的对象内部并检查消息是否与构造函数参数匹配。但这有什么好处呢?
大概,我希望这个消息类以某种方式被另一段代码使用。该代码如何工作?我会发现我可能需要一种getMessage()
方法或等效的东西来对对象做任何有用的事情。
一般来说,在单元测试中使用反射是不好的,因为它测试的是底层实现,而不是行为。当有人出现时,您的单元测试不应该中断,例如,重构代码以将数据存储在远程服务器上。
另外,我会避免用像这样的“琐碎”的测试来混淆测试。专注于测试您的业务逻辑。相信 JVM 在很大程度上可以像宣传的那样工作。
推荐阅读
- typescript - 从 Angular Firebase Firestore 数据库中获取数据
- docker - 将用户权限转发给 docker 容器
- vba - 我的问题是关于将活动工作簿中的 excel 数据附加到主文件 VBA 代码帮助请求的底部
- r - 复杂的数据重组——从宽到长(多列)
- forms - 访问关闭表单阻止插入新记录
- html - HTML 在图像底部添加扩展边框并在其上写入文本
- github - 通过 API 获取 GitHub 存储库的只读属性
- arrays - MongoDB 从对象数组中查找平均值
- vue.js - Vuetify Snackbar 在 x 秒后消失,如何防止
- c++ - 有没有办法在 STL 中禁用异常,或者使用 EASTL 是唯一的选择?