我正在尝试使用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");


其他所有注射都工作正常。有人知道可能遗漏了什么吗?

最佳答案

在单元测试中,您不在托管环境中。
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();
        }
    }
}


在测试类路径中

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

08-17 01:17