我正在尝试使用Delta Spike(@RunWith(CdiTestRunner.class)
)在单元测试中使用CDI(使用Open Web Bean)。依赖注入工作正常,但我的EntityManagerFactory始终为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
没问题,因为我可以手动创建会话工厂:
EntityManagerFactory test = Persistence.createEntityManagerFactory("sbPersistenceUnit");
所有其他注射都工作正常。有人知道可能缺少什么吗?
答案 0 :(得分:1)
您需要使用@PersistenceUnit
注入EntityManagerFactory。 @PersistentContext
用于EntityManager注入。
答案 1 :(得分: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();
}
}
}
在test-classpath
中如果你在他们的邮件列表上提出这样的问题,你很快就会得到答案。
答案 2 :(得分:0)
您是否将entitymanagerFactory定义为bean?
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>