如何从测试中注入上下文
How to Inject a context from a test
我正在测试一个 (Eclipse 4) 应用程序(我不是在谈论单元测试,而是更多的集成和系统测试)。
我有一个反复出现的问题需要解决。我必须 "inject" (@Inject) 来自测试的上下文到被测试的 class(es) 中。换句话说,我需要测试执行应用程序通常执行的操作。
我所做的是创建一个私有方法:
private IEclipseContext createApplicationContext() {
IEclipseContext tempContext = E4Application.createDefaultContext();
ContextInjectionFactory.make(CommandServiceAddon.class, tempContext);
ContextInjectionFactory.make(ContextServiceAddon.class, tempContext);
eventBroker = (IEventBroker) tempContext.get(IEventBroker.class.getName());
tempContext.set(IEventBroker.class, eventBroker);
return tempContext;
}
我预计(错误地)刚刚在此处创建的上下文将在其中一个被测 classes 中可用。例如:
class MyDBClassToTest {
@Inject
private IEclipseContext context;
@Inject
private IEventBroker broker;
// ... etc
}
肯定是少了什么!
我也创建了激活器(在实现下面,为简洁起见,没有评论)......但没有帮助:
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
public class Activator extends AbstractUIPlugin {
// The shared instance
private static Activator plugin;
// The plug-in ID
public static final String PLUGIN_ID = "my.path....";
public static Activator getDefault() {
return plugin;
}
public Activator() {
}
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
}
@Override
public void stop(BundleContext context) throws Excepti`enter code here`on {
plugin = null;
super.stop(context);
}
}
有什么想法、提示或建议吗?
您需要将 ContextInjectionFactory.make
与您的上下文结合使用来创建您要测试的 class:
ContextInjectionFactory.make(MyDBClassToTest.class, tempContext);
或者你可以使用ContextInjectionFactory.inject
注入到一个已经构造好的class:
MyDbClassToTest myClass = new MyDbClassToTest();
ContextInjectionFactory.inject(myClass, tempContext);
只有 class 使用其中一种方法创建的 es 会被注入。
您可以使用任何其他可以注入私有字段的轻量级注入框架。
例如,将 Mockito 与 @Spy(允许注入真实对象,而不仅仅是模拟对象)和 @InjectMocks 一起使用。有关示例,请参阅 this answer。
或者编写你自己的微型注射器。 Here is an example(在 post 的底部)用于 EJB,但您可以调整它以使用 Eclipse 注释。
我正在测试一个 (Eclipse 4) 应用程序(我不是在谈论单元测试,而是更多的集成和系统测试)。
我有一个反复出现的问题需要解决。我必须 "inject" (@Inject) 来自测试的上下文到被测试的 class(es) 中。换句话说,我需要测试执行应用程序通常执行的操作。
我所做的是创建一个私有方法:
private IEclipseContext createApplicationContext() {
IEclipseContext tempContext = E4Application.createDefaultContext();
ContextInjectionFactory.make(CommandServiceAddon.class, tempContext);
ContextInjectionFactory.make(ContextServiceAddon.class, tempContext);
eventBroker = (IEventBroker) tempContext.get(IEventBroker.class.getName());
tempContext.set(IEventBroker.class, eventBroker);
return tempContext;
}
我预计(错误地)刚刚在此处创建的上下文将在其中一个被测 classes 中可用。例如:
class MyDBClassToTest {
@Inject
private IEclipseContext context;
@Inject
private IEventBroker broker;
// ... etc
}
肯定是少了什么! 我也创建了激活器(在实现下面,为简洁起见,没有评论)......但没有帮助:
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
public class Activator extends AbstractUIPlugin {
// The shared instance
private static Activator plugin;
// The plug-in ID
public static final String PLUGIN_ID = "my.path....";
public static Activator getDefault() {
return plugin;
}
public Activator() {
}
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
}
@Override
public void stop(BundleContext context) throws Excepti`enter code here`on {
plugin = null;
super.stop(context);
}
}
有什么想法、提示或建议吗?
您需要将 ContextInjectionFactory.make
与您的上下文结合使用来创建您要测试的 class:
ContextInjectionFactory.make(MyDBClassToTest.class, tempContext);
或者你可以使用ContextInjectionFactory.inject
注入到一个已经构造好的class:
MyDbClassToTest myClass = new MyDbClassToTest();
ContextInjectionFactory.inject(myClass, tempContext);
只有 class 使用其中一种方法创建的 es 会被注入。
您可以使用任何其他可以注入私有字段的轻量级注入框架。
例如,将 Mockito 与 @Spy(允许注入真实对象,而不仅仅是模拟对象)和 @InjectMocks 一起使用。有关示例,请参阅 this answer。
或者编写你自己的微型注射器。 Here is an example(在 post 的底部)用于 EJB,但您可以调整它以使用 Eclipse 注释。