The use of an inner-class annotated as an EJB can get you all the resources you may need to run your test case such as a UserTransaction, EntityManager, JMS Topic or Queue, DataSource, references to other EJBs, etc.  

Simply add a *META-INF/ejb-jar.xml* to your *test* *sources* and start annotating your inner class as needed. 

The test logic can be placed inside the inner-class EJB or you can setup the EJB to pass the required resources to the outer class.

{code}
import junit.framework.TestCase;

import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import static javax.ejb.TransactionManagementType.BEAN;
import javax.annotation.Resource;
import javax.transaction.UserTransaction;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.persistence.EntityManager;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Properties;

public class MyTest extends TestCase {

   private EntityManager entityManager;
   private UserTransaction userTransaction;

   @Override
   protected void setUp() throws Exception {
       Properties p = new Properties();
       p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
       // set any other properties

       InitialContext initialContext = new InitialContext(p);
       TestLocal testLocal = (TestLocal) initialContext.lookup("TestBeanLocal");

       entityManager = testLocal.getEntityManager();
       userTransaction = testLocal.getUserTransaction();
   }


   /**
    * The src/test/resource/META-INF/ejb-jar.xml will cause this
    * EJB to be automatically discovered and deployed when
    * OpenEJB boots up.
    */
   @Stateless
   @TransactionManagement(BEAN)
   public static class TestBean implements TestLocal {

       @Resource
       private UserTransaction userTransaction;

       @PersistenceContext(type = PersistenceContextType.EXTENDED)
       private EntityManager entityManager;

       public UserTransaction getUserTransaction() {
           return userTransaction;
       }

       public EntityManager getEntityManager() {
           return entityManager;
       }
   }

   public static interface TestLocal {
       EntityManager getEntityManager();
       UserTransaction getUserTransaction();
   }

}
{code}

