如何从测试中注入上下文

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