java - 如何测试调用私有(private)方法的匿名内部类

标签 java unit-testing testing junit

我们有一堆监听来自服务器的事件然后响应它们的类。例如:

class EventManager {
    private Set<Event> cache = new HashSet<Event>();

    private EventListener eventListener = new EventListener() {
        void onEvent(Event e) {
          if (e instanceof MyEvent || e instanceof YourEvent) {
            handleEvent(e);
          }  
        }
    }

    public EventManager(ServerCommunication serverComm) {
        serverComm.addListener(eventListener);
    }

    private handleEvent(Event e) {
        // handle the event...
        // ...
        cache.add(cache);
        // ...
    }
}

这是我们正在做的事情的虚构示例。以下是我看到的问题:

  1. 我想测试 handleEvent 以确保它正在做它应该做的事情,但我不能,因为它是私有(private)的。
  2. 我还想检查缓存中是否也添加了某些内容,但这似乎也很困难,因为缓存是私有(private)成员,我不想添加不必要的 getter 方法。
  3. 我还想测试匿名类的 onEvent 方法中的代码。

现在,我所做的是将所有逻辑从匿名类移至 handleEvent 方法,并将 handleEvent 包设为私有(private)(我的单元测试在同一个包中)。我没有检查缓存的内容,尽管我想这样做。

有没有人对更易测试的更好设计有任何建议?

最佳答案

我可能会提取一个 EventCache 组件。您可以使用计算缓存事件或记录任何感兴趣内容的实现来替换您的测试。

我可能不会更改 handleEvent 的可见性。您可以实现仅从测试用例中引发事件的 ServerCommunication。

关于java - 如何测试调用私有(private)方法的匿名内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3262759/

相关文章:

python - 如何在 Python 中对单元测试进行时间分析?

angularjs - 在 Protractor 中使用 Angular 函数 ($q)

ruby-on-rails - 在 Rails 中自动测试模型

perl - 对命令行应用程序进行压力测试

java - 如何创建自定义 JUnit5 扩展

java - Mockito 与 JMockit 之间的比较 - 为什么 Mockito 比 JMockit 更好?

Java 集合和垃圾收集器

Java - 为什么 mouseClicked 方法在执行完成后不会永久重置变量?

java - 将输入格式化程序和密码特征与 swing 一起使用

java - 将字符数组列表转换为字符串的最佳方法