首页 > 解决方案 > 我应该注入一个 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);
    }
}

我创建了两个构造函数来显示我试图从中选择的两个选项。我想测试这个实现,如果我不从外部为我的听众注入一个集合,我就无法实现它。另一方面,如果我注入它,我可以在其他地方改变这个对象,我的实现不是那么安全。

在这种情况下,有没有办法同时实现可测试性和安全性?

标签: javaunit-testingtesting

解决方案


将您创建的用于测试打包的构造函数设为私有,这将降低此 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);
    }

推荐阅读