我已经看过了这个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/

10-12 00:25
查看更多