Проблема тестирования EJB вне контейнера заключается в том, что инъекции не выполняются.Я нашел это решение.В сессионном компоненте без сохранения состояния у вас есть аннотация @PersistenceContext в автономной среде Java-SE, которую вам нужно самостоятельно внедрить диспетчер сущностей, что можно сделать в модульном тесте.Это быстрая альтернатива встроенному серверу.
@Stateless
public class TestBean implements TestBusiness {
@PersistenceContext(unitName = "puTest")
EntityManager entityManager = null;
public List method() {
Query query = entityManager.createQuery("select t FROM Table t");
return query.getResultList();
}
}
Unittest создает экземпляр управления данными и «внедряет» его в компонент.
public class TestBeanJUnit {
static EntityManager em = null;
static EntityTransaction tx = null;
static TestBean tb = null;
static EntityManagerFactory emf = null;
@BeforeClass
public static void init() throws Exception {
emf = Persistence.createEntityManagerFactory("puTest");
}
@Before
public void setup() {
try {
em = emf.createEntityManager();
tx = em.getTransaction();
tx.begin();
tb = new TestBean();
Field field = TestBean.class.getDeclaredField("entityManager");
field.setAccessible(true);
field.set(tb, em);
} catch (Exception ex) {
ex.printStackTrace();
}
}
@After
public void tearDown() throws Exception {
if (em != null) {
tx.commit();
em.close();
}
}
}