Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Eclipse4 RCP中使用/测试事件服务的正确方法_Eclipse_Unit Testing_Events_Dependency Injection_E4 - Fatal编程技术网

在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提供的事件服务,以便我的插件保持松散耦合。我使用依赖注入将事

让我问两个耦合的问题,可以归结为一个关于好的应用程序设计;-)

  • 在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) 
    
    现在问题是:

  • 为了成功注入IEventBroker,我的类需要访问当前的IEclipseContext。我使用事件服务的大多数类都没有被e4应用程序模型引用,因此我必须在实例化时使用
    ContextInjectionFactory.inject(myEventSendingObject,context)手动注入上下文
    这种方法很有效,但我发现自己在使用事件服务的任何地方都会传递大量的上下文。这真的是跨E4应用程序进行基于事件的通信的正确方法吗

  • 如何为使用事件服务(作为发送方或接收方)的类轻松编写JUnit测试?显然,由于没有可用的上下文,上述注释都不能单独工作。我知道每个人都相信依赖注入简化了可测试性。但这也适用于像IEventBroker这样的注入服务吗

  • 描述如何创建自己的IEclipseContext,以在测试中包含DI过程。不确定这是否可以解决我的第二个问题,但我也犹豫是否将所有测试作为JUnit插件测试运行,因为为每个单元测试启动PDE似乎不太现实。也许我只是误解了方法

    谈到“简单地嘲笑IEventBroker”。是的,那太好了!不幸的是,我找不到任何关于如何实现这一目标的信息


    所有这些都让我怀疑我是否仍在正确的轨道上,或者这是否已经是一个糟糕的设计案例?如果是这样,你会如何重新设计?是否将所有与事件相关的操作移动到专用的事件发送方/接收方类或专用插件

    实际上,运行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如何在单元测试中被模仿吗?