Inheritance JEE:将注入的属性替换为单元测试的模拟,在容器外部

Inheritance JEE:将注入的属性替换为单元测试的模拟,在容器外部,inheritance,junit,dependency-injection,jboss6.x,Inheritance,Junit,Dependency Injection,Jboss6.x,我有一个要测试的EJB。我正在为JBossEAP6.4编写代码,但我想进行单元测试。EJB(SendMessageTimer)继承自另一个类(ResettableTimer),该类有一个注入@EJB(也尝试了@Resource)的TimerService(理论上由EAP提供)。 我发现:这大致就是我想要做的,但easygloss似乎已经死了——我看不到任何下载,已经6年没有更新了。我从这个开始,它做了一些类似的事情,但是使用了数据源,所以看起来它应该是可能的: 我在TimerService调用时

我有一个要测试的EJB。我正在为JBossEAP6.4编写代码,但我想进行单元测试。EJB(SendMessageTimer)继承自另一个类(ResettableTimer),该类有一个注入@EJB(也尝试了@Resource)的TimerService(理论上由EAP提供)。 我发现:这大致就是我想要做的,但easygloss似乎已经死了——我看不到任何下载,已经6年没有更新了。我从这个开始,它做了一些类似的事情,但是使用了数据源,所以看起来它应该是可能的:

我在TimerService调用时得到一个空指针。我认为这是因为sendTimer是独立创建的,而不是由ic上下文初始化的。另一件事可能是我在哈希表中对初始上下文使用了错误的属性。似乎有很多不同的,但我不确定有什么不同。我想知道的是,有没有可能从上下文中创建sendTimer(它可能会在上下文中注入TimerService),而不是绑定一个已创建的sendTimer;这样做有意义吗?我是否应该放弃这种方法,转而使用一个测试框架,如果有的话,还有什么建议吗? 提前谢谢你能给我的任何帮助

public abstract class parentTimer {

  @EJB
  private static TimerService timerService;

  Timer resettableTimer = null;

  public void reset(){
       //Nullpointer here!
       resettableTimer = timerService.createTimer(timeout, getName());
  }

  @Timeout
  public abstract void doTimerActions() throws Exception;
}

@EJB
public class SendTimer extends ResetableTimer {
   public SendTimer() {}

   @Override
   @Timeout
   public void doTimerActions() throws IOException, JMSException { 
       this.reset()
   }
}

public class SendTimerTest {

    private static InitialContext ic;    

    @BeforeClass
    public static void setUpClass() throws Exception {

        ic = createInitialContext();
        makeAllSubcontexts(ic, "java:/javax/ejb");

        TimerService mockTimerService = Mockito.mock(TimerService.class);
        Timer mockTimer = Mockito.mock(Timer.class);

        Mockito.when(mockTimerService.createTimer(Mockito.anyLong(), Mockito.any(String.class))).thenReturn(mockTimer);

        ic.bind("java:/javax/ejb/TimerService", mockTimerService);
    }

    private static InitialContext createInitialContext() throws NamingException {

        if (ic != null) {
            return ic;
        }

        // Create initial context
        Hashtable ht = new Hashtable();
        ht.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
        ht.put(InitialContext.URL_PKG_PREFIXES, "org.apache.naming");
        ic = new InitialContext(ht);
        return ic;
    }

    @Test
    public void testDoAcTimerActions() {
        TimerService service = (TimerService) ic.lookup("java:/javax/ejb/TimerService");
        //This context is created successfully because the assert here passes
        assertNotNull(service);

        makeAllSubcontexts(ic, "java:/my/timers/package");

        SendTimer sendTimer = new SendTimer();
        sendTimer.setTimerService(service);
        sendTimer.reset();
        ic.bind("java:/my/timers/package/SendTimer", sendTimer);
        SendTimer timer = (SendTimer) ic.lookup("java:/my/timers/package/SendTimer");

    assertNotNull(timer);

    timer.doTimerActions();  //Nullpointer from parentTimer

}