2

我试图让 CDI(带有 Open Web Beans)在使用 Delta Spike(@RunWith(CdiTestRunner.class))的单元测试中工作。依赖注入工作正常,但我的 EntityManagerFactory 始终为空:

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");

并且所有其他注射都工作正常。有人知道可能缺少什么吗?

4

3 回答 3

1

您将需要使用@PersistenceUnit注入 EntityManagerFactory。@PersistentContext用于 EntityManager 注入。

于 2015-04-18T18:23:26.600 回答
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();
        }
    }
}

在测试类路径中

如果你在他们的邮件列表上问这样的问题,你很快就会得到答案。

于 2015-06-27T23:12:03.153 回答
0

您是否将 entitymanagerFactory 定义为 bean?

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
于 2015-04-17T15:38:42.287 回答