【发布时间】:2010-07-16 07:26:00
【问题描述】:
我们有一堆类来监听来自服务器的事件然后响应它们。例如:
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);
// ...
}
}
这是我们正在做的事情的虚构示例。以下是我看到的问题:
- 我想测试 handleEvent 以确保它正在做它应该做的,但我不能,因为它是私有的。
- 我还想检查是否也将某些内容添加到缓存中,但这似乎也很困难,因为缓存是私有成员,我不想添加不必要的 getter 方法。
- 我还想测试匿名类的 onEvent 方法中的代码。
目前,我所做的是将所有逻辑从匿名类移至 handleEvent 方法,并将 handleEvent 包设为私有(我的单元测试在同一个包中)。虽然我想检查缓存的内容,但我没有检查。
有没有人对更好的、更可测试的设计有任何建议?
【问题讨论】:
-
EventManager上的第二种方法应该是public EventManager(ServerCom....)?
-
它已经是公开的了...不过我已经改了名字,我无意中将构造函数命名为 EventListener(..)。
-
这是我的解决方案。 ServerCommunication 使用 Mockito 进行模拟。我使用 ArgumentCaptor 来获取侦听器,然后将其称为 onEvent 方法。我最初不喜欢这个解决方案,因为 Mockito 说 ArgumentCaptors 应该只用于验证,而不是用于存根,但是,我不同意他们的推理(他们说“它使测试的可读性降低。”)我不要费心直接测试缓存。之后我会做其他事情,这取决于缓存中的内容。
标签: java unit-testing testing junit