我正在测试(Eclipse 4)应用程序(我不是在谈论单元测试,而是更多的集成和系统测试)。
我需要解决一个经常出现的问题。我必须从测试中“注入”(@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());
tempContext.set(IEventBroker.class, eventBroker);
return tempContext;
}
我期望(错误地)在这里创建的上下文可以在其中一个被测试的类中使用。例如:
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);
}
}
任何想法,提示或建议?
答案 0 :(得分:1)
您需要在上下文中使用ContextInjectionFactory.make
来创建要测试的类:
ContextInjectionFactory.make(MyDBClassToTest.class, tempContext);
或者您可以使用ContextInjectionFactory.inject
注入已经构建的类:
MyDbClassToTest myClass = new MyDbClassToTest();
ContextInjectionFactory.inject(myClass, tempContext);
仅注入使用这些方法之一创建的类。
答案 1 :(得分:0)
您可以使用任何其他可以注入私有字段的轻量级注入框架。
例如,使用Mockito和@Spy(允许注入真实对象,而不仅仅是模拟)和@InjectMocks。有关示例,请参阅this answer。
或者编写自己的迷你注射器。 EJB的Here is an example(在帖子的底部),但你可以调整它以使用Eclipse注释。