我已经看过了这个thread,它看起来像重复的,但不能解释我面临的两个问题:可测试性和可变性。
我有一个实现可观察模式的类。为了简单起见,让我们想象一下它是这样的:
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);
}
关于java - 我是否应该注入(inject)HashSet来存储监听器以实现可测试性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57819688/