【发布时间】:2016-11-05 13:59:23
【问题描述】:
我有两个触发两个事件的类(代码来自带有私有内部类的 junit 测试):
private static class EventEmitter1 { @Inject private Event<EventData1> event; }
private static class EventEmitter2 { @Inject private Event<EventData2> event; }
在我的测试中 EventData 类是微不足道的:
private class EventData1 { }
private class EventData2 { }
在接收器类中,我想等到两个事件都收到,所以我尝试了这样的事情:
private static class EventReceiver {
private boolean eventData1Received = false;
private boolean eventData2Received = false;
private void receiveEventData1(@Observes EventData1 eventData) {
LOGGER.debug("received " + eventData.getClass().getName());
eventData1Received = true;
handleReceivedEvents();
}
private void receiveEventData2(@Observes EventData2 eventData) {
LOGGER.debug("received " + eventData.getClass().getName());
eventData2Received = true;
handleReceivedEvents();
}
private void handleReceivedEvents() {
LOGGER.debug("eventData1Received: " + eventData1Received + ", eventData2Received: " + eventData2Received);
}
}
在我的测试方法中,我手动为两个发射器类选择一个实例,并为每个实例触发一个事件。此外,我手动选择了一个 Receiver 实例。
@Test public void receiveEvents() {
EventReceiver eventReceiver = CDI.current().select(EventReceiver.class).get();
Instance<EventEmitter1> instanceEventEmitter1 = CDI.current().select(EventEmitter1.class);
EventEmitter1 eventEmitter1 = instanceEventEmitter1.get();
EventData1 eventData1 = new EventData1();
eventEmitter1.event.fire(eventData1);
Instance<EventEmitter2> instanceEventEmitter2 = CDI.current().select(EventEmitter2.class);
EventEmitter2 eventEmitter2 = instanceEventEmitter2.get();
EventData2 eventData2 = new EventData2();
eventEmitter2.event.fire(eventData2);
}
通过 CDI.current.select(...) 手动选择应该确保 CDI 机制正常工作。
我现在的问题是这种方式三! EventReceiver 实例被初始化。他们都没有将 eventDataXReceived 字段设置为 true。将事件传递到同一个 EventReceiver 实例的正确方法是什么?理想情况下,EventReceiver 不应是(应用程序范围的)单例。
感谢您的帮助。
【问题讨论】: