在Eclipse4 RCP中使用/测试事件服务的正确方法
让我问两个耦合的问题,可以归结为一个关于好的应用程序设计;-)在Eclipse4 RCP中使用/测试事件服务的正确方法,eclipse,unit-testing,events,dependency-injection,e4,Eclipse,Unit Testing,Events,Dependency Injection,E4,让我问两个耦合的问题,可以归结为一个关于好的应用程序设计;-) 在e4 RCP应用程序中使用基于事件的通信的最佳实践是什么 如何为使用依赖注入和IEventBroker发送/接收事件的类编写简单的单元测试(使用JUnit) 让我们更具体一点:假设我正在开发一个Eclipse4RCP应用程序,它由几个需要通信的插件组成。为了进行通信,我希望使用org.eclipse.e4.core.services.events.IEventBroker提供的事件服务,以便我的插件保持松散耦合。我使用依赖注入将事
@Inject static IEventBroker broker;
private void sendEvent() {
broker.post(MyEventConstants.SOME_EVENT, payload)
}
在接收器端,我有一种方法,如:
@Inject
@Optional
private void receiveEvent(@UIEventTopic(MyEventConstants.SOME_EVENT) Object payload)
现在问题是:
ContextInjectionFactory.inject(myEventSendingObject,context)手动注入上下文代码>
这种方法很有效,但我发现自己在使用事件服务的任何地方都会传递大量的上下文。这真的是跨E4应用程序进行基于事件的通信的正确方法吗
所有这些都让我怀疑我是否仍在正确的轨道上,或者这是否已经是一个糟糕的设计案例?如果是这样,你会如何重新设计?是否将所有与事件相关的操作移动到专用的事件发送方/接收方类或专用插件 实际上,运行JUnit插件测试并没有那么昂贵。您可以将启动配置配置配置为在中运行,以便只加载没有工作台的轻量级PDE。例如,使用Tycho运行无头构建时也会发生同样的情况。Surefire默认情况下作为无头插件测试启动测试包 与独立单元测试相比,它的优势在于您可以访问插件的资源,最重要的是,可以使用依赖项注入。如果你想模拟一个注入的对象,你必须运行一个插件测试,这样你才能使用InjectorFactory 这就是模拟事件服务的方式:IEventBroker是一个接口,所以您只需要为它编写一个模拟实现
public class IEventBrokerMock implements IEventBroker {
@Override
// Implemented Methods
}
在你的测试方法中,你会有
InjectorFactory.getDefault().addBinding(IEventBroker.class).implementedBy(IEventBrokerMock.class);
ClassUnderTest myObject = InjectorFactory.getDefault().make(ClassUnderTest.class, null);
如果您想使用上下文,测试方法将包含
IEclipseContext context = EclipseContextFactory.create();
context.set(IEventBroker.class, new IEventBrokerMock());
ClassUnderTest myObject = ContextInjectionFactory.make(ClassUnderTest.class, context);
如果您以JUnit插件测试的形式运行此测试,您的对象将注入模拟事件服务。对于测试,我使用“eventBroker=new org.eclipse.e4.ui.services.internal.events.eventBroker();”来获取要使用的eventBroker对象,而不是DI,它工作正常Eclipse4源代码中当然有大量注入IEventBroker的类。好的,谢谢,查看Eclipse源代码是个好主意。现在我主要担心的是测试。你知道IEventBroker如何在单元测试中被模仿吗?