Dependency injection 如何从测试中注入上下文

Dependency injection 如何从测试中注入上下文,dependency-injection,eclipse-rcp,integration-testing,e4,Dependency Injection,Eclipse Rcp,Integration Testing,E4,我正在测试一个(Eclipse4)应用程序(我不是说单元测试,而是更多的集成和系统测试) 我有一个反复出现的问题需要解决。我必须将测试中的上下文“注入”(@inject)到被测试的类中。换句话说,我需要测试做应用程序通常做的事情 我所做的是创建一个私有方法: private IEclipseContext createApplicationContext(){ IEclipseContext tempContext=E4Application.createDefaultContext(); Co

我正在测试一个(Eclipse4)应用程序(我不是说单元测试,而是更多的集成和系统测试)

我有一个反复出现的问题需要解决。我必须将测试中的上下文“注入”(@inject)到被测试的类中。换句话说,我需要测试做应用程序通常做的事情

我所做的是创建一个私有方法:

private IEclipseContext createApplicationContext(){
IEclipseContext tempContext=E4Application.createDefaultContext();
ContextInjectionFactory.make(CommandServiceAddon.class,tempContext);
ContextInjectionFactory.make(ContextServiceAddon.class,tempContext);
eventBroker=(IEventBroker)tempContext.get(IEventBroker.class.getName());
set(IEventBroker.class,eventBroker);
返回上下文;
}
我(错误地)期望刚才在这里创建的上下文可以在测试中的一个类中使用。例如:

类MyDBClassToTest{
@注入
私有上下文上下文;
@注入
私人投资经纪人;
//…等等
}
肯定少了些什么! 我也创建了activator(为简洁起见,在实现下面没有注释)。。。但是没有帮助:

import org.eclipse.ui.plugin.AbstractUIPlugin;
导入org.osgi.framework.BundleContext;
公共类激活器扩展了AbstractUIPlugin{
//共享实例
私有静态激活器插件;
//插件ID
公共静态最终字符串插件\u ID=“my.path…”;
公共静态激活器getDefault(){
返回插件;
}
公共激活器(){
}
@凌驾
public void start(BundleContext)引发异常{
super.start(上下文);
plugin=这个;
}
@凌驾
公共无效停止(BundleContext上下文)在{
plugin=null;
super.stop(上下文);
}
}

有什么想法、提示或建议吗?

您需要使用
ContextInjectionFactory。使用您的上下文制作
,以创建要测试的类:

ContextInjectionFactory.make(MyDBClassToTest.class,tempContext);
或者,您可以使用
ContextInjectionFactory.inject
向已构造的类中注入:

MyDbClassToTest myClass=new MyDbClassToTest();
inject(myClass,tempContext);

只有使用这些方法之一创建的类才会被注入。

您可以使用任何其他可以注入私有字段的轻量级注入框架

例如,将Mockito与@Spy(允许注入真实对象,而不仅仅是mock)和@injectmock一起使用。有关示例,请参见


或者编写自己的微型注射器。(在文章的底部)用于EJB,但您可以调整它以使用Eclipse注释。

谢谢:-)问题是MyDBClassToTest.execute在内部调用了一个对象的方法,该对象本身需要注入上下文。。。一般来说,我希望将在测试中创建的上下文“注入”或提供给整个应用程序。。。。。这可能吗?抱歉,我不太理解你的问题-但是正如我所说的,只有使用这些ContextInjectionFactory方法之一创建的类才会被注入。