如何从测试中注入上下文

时间:2015-05-23 23:09:04

标签: dependency-injection eclipse-rcp integration-testing e4

我正在测试(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);
    }
}

任何想法,提示或建议?

2 个答案:

答案 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注释。