java - 我应该注入一个 HashSet 来存储侦听器以实现可测试性吗?
问题描述
我看到这个线程可能看起来像重复,但它并没有解释我面临的两个问题:可测试性和可变性。
我有一个实现可观察模式的类。为了简单起见,让我们想象一下:
public class Observable {
private final Set<Listener> listeners;
public Observable(final Set<Listener> listeners) {
this.listeners = listeners;
}
public Observable() {
listeners = new HashSet<>();
}
public void registerListener(Listener listener) {
listeners.add(listener);
}
public void unregisterListener(Listener listener) {
listeners.remove(listener);
}
}
我创建了两个构造函数来显示我试图从中选择的两个选项。我想测试这个实现,如果我不从外部为我的听众注入一个集合,我就无法实现它。另一方面,如果我注入它,我可以在其他地方改变这个对象,我的实现不是那么安全。
在这种情况下,有没有办法同时实现可测试性和安全性?
解决方案
将您创建的用于测试打包的构造函数设为私有,这将降低此 ctor 的可访问性并让用户知道这不是他们应该使用的东西。将您的测试放在同一个包中,您应该能够访问此ctor。
改变这个:
public Observable(final Set<Listener> pListeners) {
// here pListeners is immutable
this.listeners = new HashSet(pListeners);
}
对此:
Observable(final Set<Listener> pListeners) {
// here pListeners is immutable
this.listeners = new HashSet(pListeners);
}
推荐阅读
- android-espresso - 如何在 Kotlin Flow 中使用 Espresso?
- lisp - 打印输入数字的总和
- python - Celery as a service - PermissionError: [Errno 13] Permission denied: '/var/run/celery'
- parsing - SYSLOG-NG:将相同的日志发送到弹性搜索中的两个不同索引
- java - 如何知道maven项目中的所有间接jar(不是maven依赖的直接部分)引用
- json - 从特定请求链接保存特定 Json
- java - 使用 java netbeans 更新列数据库
- android - 在装有 Android 11 的小米手机上应用通知样式时的 RemoteServiceException
- flutter - 无法在颤动中调整svg图片的大小
- c++ - QQuickWidget 自定义大小调整模式