2015-04-17 8 views
1

Я пытаюсь получить CDI (с открытым веб-бобами), работающий в рамках единичного теста с использованием Delta Spike (@RunWith(CdiTestRunner.class)). Зависимость от впрыска работает нормально, но мой EntityManagerFactory всегда нуль:@PersistenceContext всегда null

public class EntityManagerProducer { 

    @PersistenceContext(unitName = "sbPersistenceUnit") 
    private EntityManagerFactory emf; //Always null 

    @Produces 
    public EntityManager create() {    
     return emf.createEntityManager(); 
    } 

    public void close(@Disposes EntityManager em) { 
     if (em.isOpen()) { 
      em.close(); 
     } 
    } 
} 

Я знаю, что мой persistence.xml все в порядке, потому что я могу создать завод Session вручную:

EntityManagerFactory test = Persistence.createEntityManagerFactory("sbPersistenceUnit"); 

и все другие инъекции работают отлично. Кто-нибудь знает, чего не хватает?

ответ

1

В модульном тесте вы не находитесь в управляемой среде. OpenWebBeans будет поддерживать его через модуль openwebbeans-resource + @PersistenceUnit, но это не переносимо. Таким образом, вы должны использовать например .:

@Specializes 
public class TestEntityManagerProducer extends EntityManagerProducer { 
    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("..."); 

    @Produces 
    //... 
    @Override 
    protected EntityManager create() { 
     return emf.createEntityManager(); 
    } 

    @Override 
    protected void close(@Disposes EntityManager em) { 
     if (em.isOpen()) { 
      em.close(); 
     } 
    } 
} 

в тесте-классах

Если вы задаете такие вопросы, на их список рассылки, вы получите ответы на мелкие быстро.

+0

Спасибо за ответ, я пошел по тому же пути, что и вы предлагали, и все работает. – StuPointerException

0

Вы определяете свой entitymanagerFactory как фасоль?

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 
+0

Благодарим за предложение, однако в этом проекте нет весны - это чистый CDI, – StuPointerException

+0

ОК, извините за это, вы пытаетесь это сделать? http://stackoverflow.com/questions/27506727/inject-persistencecontext-with-cdi – mvlaicevich

1

Вам нужно будет использовать @PersistenceUnit впрыснуть EntityManagerFactory. @PersistentContext используется для инъекций EntityManager.

+0

Спасибо, я думаю, что я отменил его на '@ PersistentContext' в отчаянии. Оба результата приводят к фабрике нулевых сеансов. – StuPointerException

 Смежные вопросы

  • Нет связанных вопросов^_^